在我的Rails应用程序的控制器中,我可以这样做:
before_filter :login_required, :except => :index
但我想不仅根据动作名称而且根据请求的格式应用过滤器。换句话说,我想做这样的事情:
before_filter :login_required, :except => {:action => :index, :format => :js}
这可能吗?
答案 0 :(得分:27)
你需要自己动手一点。以此为出发点。
before_filter :login_required, :except => [:index]
before_filter(:only => :index) do |controller|
login_required unless controller.request.format.js?
end
答案 1 :(得分:13)
请记住,您也可以将lambda提取到方法中。这有助于提高可读性。它还可以更容易地对多个过滤器使用相同的检查。
before_filter :login_required, except: :index, unless: :js_request?
private
def js_request?
request.format.js?
end
答案 2 :(得分:11)
另一种我认为比接受的答案更清晰的方法是将if
或unless
选项与lambda一起使用。我只是希望将方法名称列为符号,以便使用其他控制器过滤器进行标准化。这适用于Rails 3及更高版本。
before_filter :login_required, except: :index,
unless: -> { |controller| controller.request.format.js? }