Ruby on rails 子类化控制器,以及何时调用超级

Ruby on rails 子类化控制器,以及何时调用超级,ruby-on-rails,ruby,ruby-on-rails-3,actioncontroller,Ruby On Rails,Ruby,Ruby On Rails 3,Actioncontroller,我有许多控制器会有一些类似的行为,例如,用户应该登录,需要设置一些范围,需要设置当前\u帐户/当前\u用户,并缓存权限 我正在考虑使用一个标准控制器并将其子类化 class MyStandardController < ApplicationController before_filter :xyz end class SomeController < MyStandardController end class MyStandardController

我有许多控制器会有一些类似的行为,例如,用户应该登录,需要设置一些范围,需要设置当前\u帐户/当前\u用户,并缓存权限

我正在考虑使用一个标准控制器并将其子类化

class MyStandardController < ApplicationController
 before_filter :xyz
end 

class SomeController < MyStandardController
end
class MyStandardController

我想知道的是,我是否需要/何时调用
super

您不需要在继承自另一个控制器的控制器内调用
super
;事实上,这样做可能有点奇怪。Super从一个超类中执行一个同名的方法,在
MyStandardController
上可能没有任何方法,您将在其子类中重新定义

这样做的主要原因是,正如您自己所说的,可以在控制器之间轻松地获得过滤器和方法的名称空间。我们在应用程序中也做了类似的事情,其中一个行为非常相似的站点区域将继承自一个控制器(如ShoppingController),该控制器有一部分私有便利方法,只能在其所有子节点上使用


然而,现实地说,最好有实现您想要的功能的模块,并将它们包含在您想要的控制器中。最终,您可能需要从一个控制器到另一个控制器,使用模块比使用复杂的继承层次结构更容易做到这一点。

我还想指出您引用的大多数操作包括用户身份验证(它们是吗?)和授权(它们有权访问特定资源吗?)这是最好的宝石处理像authlogic或设计与坎坎。我在使用设计,我可能会使用坎坎。完全同意维拉蒂库斯。一个简单的解决方案是将
放在
application\u controller.rb中的\u filter
之前,这是身份验证之类的典型情况。如果真的有一个名称空间(应用程序操作的子集,例如“Admin”),那么创建一个包含模型(以及视图和控制器)的模块(如
Admin::UserManager
)——before\u过滤器可以在
Admin\u controller.rb
中定义(我想)感谢另一个问题,如果我定义了一个方法,例如MyStandardController中的mydef,那么如何使它在视图中可用?如果我使用helper\u方法在MyStandardController中指定一个helper,那么它在子类化该控件所使用的视图中似乎不可用。您可能不应该这样做。改为使用helper方法,或者在控制器操作中调用该方法,并通过实例变量将结果提供给视图。嗯,我不知道为什么子类不选择
helper\u方法
。。。对不起/