before_filter和respond_to格式

在我的Rails应用程序的控制器中,我可以这样做:

before_filter :login_required, :except => :index 

但我想不仅根据动作名称而且根据请求的格式应用filter。 换句话说,我想做这样的事情:

 before_filter :login_required, :except => {:action => :index, :format => :js} 

这可能吗?

你需要自己动手一点。 试试这个作为起点。

  before_filter :login_required, :except => [:index] before_filter(:only => :index) do |controller| login_required unless controller.request.format.js? end 

请记住,您也可以将lambda提取到方法中。 这有助于提高可读性。 它还可以更容易地对多个filter使用相同的检查。

 before_filter :login_required, except: :index, unless: :js_request? private def js_request? request.format.js? end 

另一种方法,我认为比接受的答案更清晰,是使用带有lambda的ifunless选项。 我只是希望将方法名称列为符号,以便使用其他控制器filter进行标准化。 这适用于Rails 3及更高版本。

 before_filter :login_required, except: :index, unless: -> { |controller| controller.request.format.js? }