Почему направляющие before_filter названы дважды, когда контроллер разделяется на подклассы?

Я в направляющих 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]

Существует ли лучший способ решить эту проблему?

13
задан P Shved 24 May 2010 в 18:44
поделиться

2 ответа

"Такое поведение задумано".

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

"Фильтры наследуются, поэтому если вы установите фильтр на ApplicationController, он будет выполняться на каждом контроллере в вашем приложении."

Это объясняет поведение, которое вы наблюдаете. Это также предлагает точно такое же решение, которое вы предлагаете (использование skip_before_filter), чтобы определить, какие фильтры будут или не будут выполняться для конкретного контроллера и/или методов.

Итак, уродливое или нет, похоже, что решение, которое вы нашли, является общепринятой и одобренной практикой.

http://guides.rubyonrails.org/action_controller_overview.html#filters

15
ответ дан 1 December 2019 в 23:31
поделиться

Если вы не хотите использовать skip_before_filter, вы всегда можете пропустить действие index в ChildController:

class ChildController < BaseController
  before_filter :foo, :only => [:show, :other, :actions]
end

Но это может стать проблемой, если вы измените поведение в BaseController и удалите фильтр из действия index. Тогда он никогда не будет вызываться, поэтому использование skip_before_filter может быть лучшей идеей.

3
ответ дан 1 December 2019 в 23:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: