在我的项目中,我借助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
答案 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)