Рельсы пропускают все перед фильтром

может кто-нибудь сказать мне, как пропустить все перед фильтрами в рельсах 3.

В рельсах 2.x мы могли бы сделать

skip_filter filter_chain

однако filter_chain больше не поддерживается в рельсах 3.

Спасибо

Ответ 1

Попробуйте это

skip_filter *_process_action_callbacks.map(&:filter)

Метод _process_action_callbacks должен возвращать экземпляр CallbackChain, который представляет собой массив Callback s И поскольку фильтр обратного вызова получает имя обратного вызова, это работает:

before_filter :setup
_process_action_callbacks.map(&:filter) #=> [:setup]

Ответ 2

Необходимо пропустить все фильтры, скорее всего, вызвано наследованием от пользовательского ApplicationController.

class ApplicationController < ActionController::Base
  # defines multiple `before_filter`s common to most controllers

class SomeController < ApplicationController
  # this controller may be fine with inheriting all filters

class AnotherController < ApplicationController
  # but this one not!

В моем примере сценария вместо удаления before_filter из AnotherController просто наследуйте его от ActionController::Base.

Ответ 3

Не пробовал, но это может сработать:

[:before, :after, :around].each {|type| reset_callbacks(type)}

Ответ 4

Если вы хотите указать: только или: кроме skip_filter, используйте следующее:

skip_filter(:only => [:method1, :method2], *_process_action_callbacks.map(&:filter))

Ксавье Шей поставил меня в правильном направлении, но потом я изо всех сил пытался понять, что мне пришлось поставить: только перед списком фильтров пропустить!

Изменить: решение выше для RUby 1.8.7. Для Ruby 1.9 вы бы сделали:

skip_filter(*_process_action_callbacks.map(&:filter), :only => [:method1, :method2])

Ответ 5

Для Rails 5 я использовал

class SomeController < ApplicationController    

  skip_before_action *_process_action_callbacks.map{|callback| callback.filter if callback.kind == :before}.compact

Вы должны проверить callback.kind, иначе _process_action_callbacks возвратит все обратные вызовы, включая after и around, что вызовет исключение с skip_before_action метода skip_before_action.

.compact в конце удаляет nils из результирующего массива.

Ответ 6

Это, безусловно, взламывает глубоко внутри Rails belly, и вам будет лучше задавать обратные вызовы вручную, но следующая строка выполнит задание:

eval %[skip_filter #{_process_action_callbacks.select { |c|
    [:before, :after, :around].include? c.kind }.collect{|c|
      c.filter.inspect}.join(", ")
    }]

Вы также можете добавить :only => :index и т.д. изменения в eval перед окончанием ] для дальнейшего изменения вызова, если это необходимо.