Ответ 1
Вам нужно немного свернуть. Попробуйте это как отправную точку.
before_filter :login_required, :except => [:index]
before_filter(:only => :index) do |controller|
login_required unless controller.request.format.js?
end
В контроллере в моем приложении Rails я могу сделать это:
before_filter :login_required, :except => :index
Но я бы хотел применить фильтр не только на основе имени действия, но и в формате запроса. Другими словами, я хотел бы сделать что-то вроде этого:
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
Помните, что вы также можете извлечь лямбду для метода. Это может помочь с удобочитаемостью. Это также облегчает использование одной и той же проверки для нескольких фильтров.
before_filter :login_required, except: :index, unless: :js_request?
private
def js_request?
request.format.js?
end
Другой способ, который, по моему мнению, более чистый, чем принятый ответ, заключается в использовании опций if
или unless
с лямбдой. Мне просто нравится, что имя метода указано в виде символа, поэтому оно стандартизировано с другими фильтрами контроллера. Это работает в Rails 3 и выше.
before_filter :login_required, except: :index,
unless: -> { |controller| controller.request.format.js? }