Как использовать делегаты в моем контроллере для рефакторинга кода? - PullRequest
0 голосов
/ 04 января 2019

В моем проекте я объявляю переменную экземпляра с помощью обратного вызова before_action, но некоторые из моих контроллеров имеют одинаковый код обратного вызова.Например:

my golf_courses_users_controller.rb выглядит так:

private
    def require_user_club_and_golf_course
      @club_admin_user = User.find(params[:user_id])
      @club = Club.find(params[:club_id])
      @golf_course = GolfCourse.find(params[:golf_course_id])
    end

my course_holes_controller.rb выглядит так:

private
    def initialize_objects
      @user = User.find(params[:user_id])
      @club = Club.find(params[:club_id])
      @golf_course = GolfCourse.find(params[:golf_course_id])
    end

Ответы [ 2 ]

0 голосов
/ 04 января 2019

Простой способ установить это состоит в том, чтобы иметь метод, назначающий переменные экземпляра в родительском классе (для простоты я буду использовать ApplicationController здесь), а затем вызвать before_action в соответствующемконтроллеры.

application_controller.rb

def initialize_objects
  @user = User.find(params[:user_id])
  @club = Club.find(params[:club_id])
  @golf_course = GolfCourse.find(params[:golf_course_id])
end

golf_courses_users_controller.rb

before_action :initialize_objects

course_holes_controller.rb

before_action :initialize_objects

В зависимости от того, насколько широко будет использоваться это действие до действия, вы даже можете переместить before_action к тому же родительскому контроллеру и пропустить это там, где это не нужно:

application_controller.rb

before_action :initialize_objects

a_controller_not_using_the_before_action.rb

skip_before_action :initialize_objects

Это кажется мне сухим, чистым и довольно привычным - пустьЯ знаю, что вы думаете, и если у вас есть какие-либо вопросы.

0 голосов
/ 04 января 2019

Я бы создал помощника и использовал бы его везде:

module DbHelper do
  def self.user_club_course(params)
    # maybe raise unless
    #   params.values_at(*%i[user_id club_id golf_course_id]).none?(&:nil?)
    [
      User.find(params[:user_id]),
      Club.find(params[:club_id]),
      GolfCourse.find(params[:golf_course_id])
    ]
  end
end

И использовал бы его так:

@user, @club, @golf_course = DbHelper.user_club_course(params)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...