13

我在 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 被调用了两次。

我已经尝试了许多解决此问题的方法。如果我不包括:index孩子中的动作,它永远不会被要求执行该动作。

我找到的解决方案有效,但我认为它非常非常难看

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

有没有更好的方法来解决这个问题?

4

2 回答 2

15

“此行为是设计使然”。

Rails 控制器指南指出:

“过滤器是继承的,因此如果您在 ApplicationController 上设置过滤器,它将在您应用程序中的每个控制器上运行。”

这解释了您所看到的行为。它还建议您提出的完全相同的解决方案(使用 skip_before_filter)来定义哪些过滤器将为特定控制器和/或方法运行或不运行。

因此,无论丑陋与否,您找到的解决方案似乎都是常见且被认可的做法。

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

于 2010-05-24T16:27:28.080 回答
3

如果您不想使用skip_before_filter,您可以随时跳过以下index操作ChildController

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

BaseController但是,如果您更改行为并从操作中删除过滤器,这可能会成为问题index。然后它永远不会被调用,所以使用skip_before_filter可能是一个更好的主意。

于 2010-05-24T18:54:04.897 回答