如何在控制器中使用委托来重构代码?

时间:2019-01-04 06:40:26

标签: ruby-on-rails ruby controller

在我的项目中,我借助before_action回调声明了实例变量,但是我的某些控制器具有相同的回调代码。例如:

我的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

我的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 :(得分:1)

一种简单的设置方法是让该方法在父类中分配实例变量(为简单起见,我将在此处使用ApplicationController),然后调用{{1} }”。

application_controller.rb

before_action

golf_courses_users_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

course_holes_controller.rb

before_action :initialize_objects

根据此操作的广泛使用,您甚至可以将before_action :initialize_objects 移至同一父控制器,并在不需要时跳过此操作:

application_controller.rb

before_action

a_controller_not_using_the_before_action.rb

before_action :initialize_objects

对我来说,这似乎干燥,干净而且很常规-让我知道您的想法以及是否有任何疑问。

答案 1 :(得分:0)

我会产生一个助手,并在各处使用它:

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)