может кто-нибудь сказать мне, как пропустить все перед фильтрами в рельсах 3.
В рельсах 2.x мы могли бы сделать
skip_filter filter_chain
однако filter_chain больше не поддерживается в рельсах 3.
Спасибо
может кто-нибудь сказать мне, как пропустить все перед фильтрами в рельсах 3.
В рельсах 2.x мы могли бы сделать
skip_filter filter_chain
однако filter_chain больше не поддерживается в рельсах 3.
Спасибо
Попробуйте это
skip_filter *_process_action_callbacks.map(&:filter)
Метод _process_action_callbacks
должен возвращать экземпляр CallbackChain, который представляет собой массив Callback s
И поскольку фильтр обратного вызова получает имя обратного вызова, это работает:
before_filter :setup
_process_action_callbacks.map(&:filter) #=> [:setup]
Необходимо пропустить все фильтры, скорее всего, вызвано наследованием от пользовательского 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
.
Не пробовал, но это может сработать:
[:before, :after, :around].each {|type| reset_callbacks(type)}
Если вы хотите указать: только или: кроме 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])
Для 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
из результирующего массива.
Это, безусловно, взламывает глубоко внутри 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 перед окончанием ]
для дальнейшего изменения вызова, если это необходимо.
skip_before_filters
http://ap.rubyonrails.org/classes/ActionController/Filters/ClassMethods.html#M000132