【问题标题】:Subclassing controllers, and when to call super子类化控制器,以及何时调用 super
【发布时间】:2012-03-21 14:59:46
【问题描述】:

我有很多控制器会有一些类似的行为,例如用户应该已登录,需要设置一些范围,需要设置 current_account / current_user 并缓存权限。

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

class MyStandardController < ApplicationController
 before_filter :xyz
end 

class SomeController < MyStandardController
end

我想知道我是否需要/何时致电super

【问题讨论】:

  • 我还要注意您所引用的大多数操作都围绕着用户身份验证(它们是它们吗?)和授权(它们是否可以访问特定资源?)最好由 authlogic 之类的 gem 处理或使用 cancan 进行设计。
  • 我用的是devise,我可以用cancan。

标签: ruby-on-rails ruby ruby-on-rails-3 actioncontroller


【解决方案1】:

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

正如您自己所说,这样做的主要原因是为了让过滤器和方法在控制器之间轻松命名空间。我们在我们的应用程序中执行类似的操作,其中具有非常相似行为的站点的一个区域将继承自一个控制器(如 ShoppingController),该控制器具有部分私有便捷方法,这些方法仅可用于其所有子级。

但是,实际上,最好有模块来实现您想要的功能,并将它们包含在您想要的控制器中。最终,您可能会希望从一个控制器到另一个控制器的东西,并且使用模块比使用复杂的继承层次结构更容易做到这一点。

【讨论】:

  • 完全同意 Veraticus。一个简单的解决方案是将before_filter 放在application_controller.rb 中——这对于身份验证等情况很典型。如果真的有一个命名空间(应用程序操作的子集,例如“Admin”),那么创建一个包含模型(以及视图和控制器)的模块(如Admin::UserManager)并不是一个糟糕的主意——before_filter 可以然后只需在admin_controller.rb 中定义(我认为)
  • 感谢另一个问题,如果我定义了一种方法,例如。 MyStandardController 中的 mydef,我怎样才能使它在我的视图中可用?如果我使用 helper_method 在 MyStandardController 中指定一个助手,它似乎在子类化的控制器使用的视图中不可用。
  • 你可能不应该那样做。请改用辅助方法,或在控制器操作中调用该方法,并通过实例变量将结果提供给您的视图。
  • 嗯,我不知道为什么子类不接helper_method...对不起。 ://
猜你喜欢
  • 2014-07-07
  • 2013-08-12
  • 2013-05-28
  • 2010-09-24
  • 1970-01-01
  • 1970-01-01
  • 2015-07-22
  • 2012-08-08
  • 1970-01-01
相关资源
最近更新 更多