before_filter和respond_to格式

时间:2009-04-30 23:10:13

标签: ruby-on-rails rest

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

before_filter :login_required, :except => :index

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

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

这可能吗?

3 个答案:

答案 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)

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

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