Я в направляющих 2.3.5, и у меня есть эта проблема:
class BaseController < ApplicationController
before_filter :foo, :only => [:index]
end
class ChildController < BaseController
before_filter :foo, :only => [:index, :show, :other, :actions]
end
Проблема состоит в том что на ChildController: нечто перед фильтром называют дважды.
Я попробовал много обходных решений вокруг этой проблемы. Если я не включаю :index
действие в ребенке, к этому никогда не призывают то действие.
Решение я нашел работы, но я думаю, что это очень очень ужасно
skip_before_filter :foo
before_filter :foo, :only => [:index, :show, :other, :actions]
Существует ли лучший способ решить эту проблему?
"Такое поведение задумано".
В руководстве Rails по контроллерам говорится:
"Фильтры наследуются, поэтому если вы установите фильтр на ApplicationController, он будет выполняться на каждом контроллере в вашем приложении."
Это объясняет поведение, которое вы наблюдаете. Это также предлагает точно такое же решение, которое вы предлагаете (использование skip_before_filter), чтобы определить, какие фильтры будут или не будут выполняться для конкретного контроллера и/или методов.
Итак, уродливое или нет, похоже, что решение, которое вы нашли, является общепринятой и одобренной практикой.
http://guides.rubyonrails.org/action_controller_overview.html#filters
Если вы не хотите использовать skip_before_filter
, вы всегда можете пропустить действие index
в ChildController
:
class ChildController < BaseController
before_filter :foo, :only => [:show, :other, :actions]
end
Но это может стать проблемой, если вы измените поведение в BaseController
и удалите фильтр из действия index
. Тогда он никогда не будет вызываться, поэтому использование skip_before_filter
может быть лучшей идеей.