Почему Rails before_filter вызывается дважды, когда контроллер находится в подклассах? - PullRequest
13 голосов
/ 24 мая 2010

Я на Rails 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 дважды вызывается фильтр: foo before.

Я пробовал несколько способов обойти эту проблему. Если я не включу действие :index в ребенка, оно никогда не будет вызвано для этого действия.

Решение, которое я нашел, работает, но я думаю, что оно очень, очень уродливо

skip_before_filter :foo
before_filter :foo, :only => [:index, :show, :other, :actions]

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

Ответы [ 2 ]

15 голосов
/ 24 мая 2010

«Такое поведение является заданным».

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

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

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

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

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

3 голосов
/ 24 мая 2010

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

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

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

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