Подтвердить что ты не робот

Форматы before_filter и reply_to

В контроллере в моем приложении Rails я могу сделать это:

before_filter :login_required, :except => :index

Но я бы хотел применить фильтр не только на основе имени действия, но и в формате запроса. Другими словами, я хотел бы сделать что-то вроде этого:

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

Возможно ли это?

4b9b3361

Ответ 1

Вам нужно немного свернуть. Попробуйте это как отправную точку.

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

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

Ответ 2

Помните, что вы также можете извлечь лямбду для метода. Это может помочь с удобочитаемостью. Это также облегчает использование одной и той же проверки для нескольких фильтров.

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

private

def js_request?
  request.format.js?
end

Ответ 3

Другой способ, который, по моему мнению, более чистый, чем принятый ответ, заключается в использовании опций if или unless с лямбдой. Мне просто нравится, что имя метода указано в виде символа, поэтому оно стандартизировано с другими фильтрами контроллера. Это работает в Rails 3 и выше.

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