Рельсы пропускают все перед фильтром - PullRequest
11 голосов
/ 19 мая 2011

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

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

skip_filter filter_chain

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

Спасибо

Ответы [ 7 ]

18 голосов
/ 19 мая 2011

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

skip_filter *_process_action_callbacks.map(&:filter)

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

before_filter :setup
_process_action_callbacks.map(&:filter) #=> [:setup]
8 голосов
/ 29 ноября 2013

Необходимость пропустить всех фильтров, вероятно, вызвана наследованием от пользовательского 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 s из AnotherControllerпросто дайте ему наследовать от ActionController::Base.

3 голосов
/ 19 мая 2011

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

[:before, :after, :around].each {|type| reset_callbacks(type)}
2 голосов
/ 29 июня 2012

Если вы хотите указать: только или: кроме 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])
1 голос
/ 09 августа 2018

Для 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 метод.

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

0 голосов
/ 27 июля 2012
0 голосов
/ 19 мая 2011

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

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

Вы также можете добавить :only => :index и т. Д. Модификации в eval непосредственно перед окончанием ], чтобы при необходимости дополнительно изменить вызов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...