форматы before_filter и response_to - PullRequest
26 голосов
/ 01 мая 2009

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

before_filter :login_required, :except => :index

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

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

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

Ответы [ 3 ]

27 голосов
/ 01 мая 2009

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

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

 before_filter(:only => :index) do |controller|
   login_required unless controller.request.format.js?
 end
13 голосов
/ 05 августа 2014

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

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

private

def js_request?
  request.format.js?
end
11 голосов
/ 08 октября 2013

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

before_filter :login_required, except: :index,
  unless: -> { |controller| controller.request.format.js? }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...