我有几个动作(让我们称之为action_a,action_b等)
在每个操作中,我想检查用户是否已登录,如果没有respond_to
块,则如下所示
format.js {
if current_user.nil?
render partial: 'some_partial', handler: [:erb], formats: [:js]
end
}
对于一个动作,这很好,但不是很多动作,因为这个代码会有很多重复,它们会做同样的事情,它不是很漂亮或可维护
有没有办法把它放在某处,这样我就可以重用这段代码而不是在每一个需要的动作中重写它?
答案 0 :(得分:2)
使用before_filter (rails <4.0) or before_action (rails 4.0)
class YourController < ApplicationController
before_filter :check_user
...
your actions
...
private
def check_user
redirect_to sign_in_path if current_user.nil?
end
end
或者如果你想要特定的行动并回应使用around_action(过滤器):
class YourController < ApplicationController
around_action :check_user
...
your actions
def show
@variable = Variable.last
end
...
private
def check_user
yield #(you normal action without js respond)
format.js {
if current_user.nil?
render partial: 'some_partial', handler: [:erb], formats: [:js]
end
}
end
end
答案 1 :(得分:2)
阅读Responders。这些都是为了帮助解决这个问题。
您的具体问题是通常使用的过滤器。见this Section on Filters in the Action Controller Guide
更一般地说,这只是ruby代码,因此您可以将所有内容重构为方法:
def do_stuff_with(partial_name, format)
if current_user.nil?
render partial: partial_name, handler: [:erb], formats: [format]
end
end
format_js { do_stuff_with('some_partial', :js) }