2009-04-30 21 views
26

W kontrolera w moim app Rails, mogę to zrobić:before_filter i respond_to formaty

before_filter :login_required, :except => :index 

Ale chciałbym, aby zastosować filtr nie opartego tylko na nazwie działania, ale od formatu wniosku. Innymi słowy, chciałbym zrobić coś takiego:

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

Czy to możliwe?

Odpowiedz

25

Musisz przeturlać się trochę. Spróbuj tego jako punkt wyjścia.

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

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

Dziękuję za pomoc. Musiałem tylko zastąpić login_required przez controller.send (: login_required) before_filter (: only =>: index) do | controller | controller.send (: login_required) until controller.request.format.js? koniec – gdelfino

+0

Pozwól mi powtórzyć mój komentarz, ponieważ kod nie pojawił się tak, jak się spodziewałem. Musiałem tylko wymienić login_required na controller.send (: login_required) Dzięki. – gdelfino

+0

pracował jak urok z końcówką od gdelfino – whizcreed

10

Innym sposobem, który myślę, że jest czystsze niż przyjętym odpowiedź jest użycie if lub unless opcje z lambda. Po prostu lubię, gdy nazwa metody jest wymieniona jako symbol, więc jest znormalizowana z innymi filtrami kontrolera. Działa to w Railsach 3 i nowszych.

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

Pamiętaj, że możesz wyodrębnić lambdę również do metody. Może to pomóc w czytelności. Może również ułatwić korzystanie z tego samego sprawdzenia dla wielu filtrów.

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

private 

def js_request? 
    request.format.js? 
end 
+1

Działa idealnie, ale używam 'request.format.json?' – inye

Powiązane problemy