2009-04-30 40 views
26

在我的Rails應用程序控制器,我可以這樣做:的before_filter和respond_to代碼格式

before_filter :login_required, :except => :index 

但我想不僅適用基於動作的名字,但對請求的格式過濾器。換句話說,我想這樣做:

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

這可能嗎?

回答

25

你需要推出自己的一點。試試這個作爲一個起點。

before_filter :login_required, :except => [:index] 

before_filter(:only => :index) do |controller| 
    login_required unless controller.request.format.js? 
end 
+1

謝謝你的幫助。我只需要使用controller.send替換login_required(:login_required) before_filter(:only =>:index)do | controller | controller.send(:login_required)除非controller.request.format.js? 結束 – gdelfino 2009-05-01 23:31:24

+0

讓我重複一下我的評論,因爲代碼並沒有像我期待的那樣出現。 我只需要用controller.send替換login_required(:login_required) 謝謝。 – gdelfino 2009-05-01 23:34:01

10

的另一種方式,我認爲這是比接受的答案更清潔,是使用ifunless選項是lambda。我只想將方法名稱列爲符號,以便與其他控制器過濾器進行標準化。這可以在Rails 3及更高版本中使用。

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

請記住,您也可以將lambda提取到方法中。這可以幫助提高可讀性。它還可以使在多個過濾器上使用相同的檢查變得更加容易。

before_filter :login_required, except: :index, unless: :js_request? 

private 

def js_request? 
    request.format.js? 
end