Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Views and Controllers, Forms

Views and Controllers, Forms

Good practices on how to organize business logic.

Rubizza camp.

Roman Dubrovsky

August 15, 2018
Tweet

More Decks by Roman Dubrovsky

Other Decks in Programming

Transcript

  1. 1. Getter or helpers = "#{user.first_name} #{second_name}" = user.first_name.present? ||

    user.second_name.present? ? "#{user.first_name} #{second_name}" : user.email
  2. 1. Getter or helpers = "#{user.first_name} #{second_name}" = user.first_name.present? ||

    user.second_name.present? ? "#{user.first_name} #{second_name}" : user.email class User < ApplicationRecord def full_name "#{first_name} #{second_name}" end def shown_username full_name.present? ? full_name : email end end
  3. 1. Getter or helpers = user.full_name = user.shown_name class User

    < ApplicationRecord def full_name "#{first_name} #{second_name}" end def shown_username full_name.present? ? full_name : email end end
  4. 1. Getter or helpers = user.full_name = user.shown_name class User

    < ApplicationRecord def full_name "#{first_name} #{second_name}" end def shown_username full_name.present? ? full_name : email end end
  5. 1. Getter or helpers = "#{user.first_name} #{second_name}" = user.first_name.present? ||

    user.second_name.present? ? "#{user.first_name} #{second_name}" : user.email module UsersHelpers def user_full_name(user) "#{user.first_name} #{user.second_name}" end def user_shown_username(user) full_name = user_full_name(user) full_name.present? ? full_name : user.email end end
  6. 1. Getter or helpers = user_full_name(user) = user_shown_username(user) module UsersHelpers

    def user_full_name(user) "#{user.first_name} #{user.second_name}" end def_user_shown_username_with_some_additional_params_for_also_showing_pr oposal_tension_and_comments_of_other_users_bla_bla_bla(user, commeted_users, data, ...) ... end
  7. 1. Getter or helpers = "#{user.first_name} #{second_name}" = user.first_name.present? ||

    user.second_name.present? ? "#{user.first_name} #{second_name}" : user.email https://github.com/drapergem/draper
  8. 1. Getter or helpers = user.full_name = user.shown_name class UserDecorator

    < Draper::Decorator def full_name "#{first_name} #{second_name}" end def shown_username full_name.present? ? full_name : email end end https://github.com/drapergem/draper
  9. 1. Getter or helpers = "#{user.first_name} #{second_name}" = user.first_name.present? ||

    user.second_name.present? ? "#{user.first_name} #{second_name}" : user.email http://nithinbekal.com/posts/rails-presenters/
  10. 1. Getter or helpers = user_page_presenter.full_name = user_page_presenter.shown_name class UserPagePresenter

    < Struct.new(:user, …) def full_name "#{user.first_name} #{user.second_name}" end def shown_username full_name.present? ? full_name : user.email end end
  11. 2. Services app/controller/users_controller.rb def create user = User.new(user_params) if user.valid?

    user.save UserMailer.send_hello(user).deliver_later redirect_to user_path(user) else render :new end end
  12. 2. Services app/controller/users_controller.rb def create user = User.new(user_params) if user.valid?

    user.save redirect_to user_path(user) else render :new end end app/models/user.rb class User < ApplicationRecord after_create do UserMailer.send_hello(user) .deliver_later end end https://medium.com/planet-arkency/the-biggest-rails-code-smell-you-should-avoid- to-keep-your-app-healthy-a61fd75ab2d3
  13. 2. Services app/controller/users_controller.rb def create user = User.new(user_params) if user.valid?

    user.save redirect_to user_path(user) else render :new end end app/models/user.rb class User < ApplicationRecord after_create do UserMailer.send_hello(user) .deliver_later end end https://medium.com/planet-arkency/the-biggest-rails-code-smell-you-should-avoid- to-keep-your-app-healthy-a61fd75ab2d3
  14. 2. Services app/controller/users_controller.rb def create user = User.new(user_params) if user.valid?

    user.transaction do user.save user.create_team(team_params) end UserMailer.send_hello(user).deliver_later redirect_to user_path(user) else render :new end end
  15. 2. Services app/controller/users_controller.rb def create user = User.new(user_params) if user.valid?

    CreateUserService.new(user).call redirect_to user_path(user) else render :new end end app/services/create_user_service.rb class CreateUserService < Struct.new(:user) def call user.transaction do user.save user.create_team(team_params) end send_notification end private def send_notification UserMailer.send_hello(user).deliver_later end end
  16. 2. Services app/controller/users_controller.rb def create result = CreateUserService .new(user_params) .call

    if result.success? redirect_to user_path(result.object) else @user = result.object render :new end end app/services/create_user_service.rb class CreateUserService < Struct.new(:user_params) def call if user.valid? create_user SuccessResult(object: user) else ErrorResult.new(object: user) end private def user @_user || User.new(user_params) end end