真的,你不应该。更好的方法是将控制器方法重构到全局可访问的地方,例如config/initializers
文件中的文件或application.rb本身。然后从控制器调用它。原因是控制器方法可以访问特殊变量,如request
和params
,这些变量在别处不可用。所以这是Rails开发的一部分,可以被认为是框架设计的一部分。学习如何以正确的方式做事更容易。
这就是说,这是可能的。
说我在PagesController
有一个路线叫root
。这很容易初始化控制器:
controller = PagesController.new
但运行controller.root
引发错误:
NoMethodError: undefined method `parameters' for nil:NilClass
需要一些背景来解释为什么提出这个错误。我的控制器有一个secure_params方法,在任何路由运行时都会调用它。此方法预计在控制器中定义一个params
对象。我的控制器中还有一个before_action
,其中引用了session
。
class FakeRequest
def parameters
{}
end
def session
{}
end
end
可以这样使用:这两个对象在request
对象,我可以“模拟”,例如上定义
controller = PagesController.new
controller.request = FakeRequest.new
controller.root
这将运行控制器动作,然而,假请求对象可能需要更改,具体取决于您的控制器要求正确运行的要求。
如果您坚持在整个应用程序中共享控制器方法,那么使用类方法可能更容易。这消除了构造虚假请求并实例化控制器的必要性。
编辑答案添加一个如何做到这一点的例子,而不是简单地建议反对它 –