2016-07-13 48 views
1

我有一个简单的方法在ApplicationController,调用数据库并加载一些数据。我需要在application.rb运行它,就像这样:Rails - 如何使用application.rb中的控制器的方法?

MY_CONST = method_in_application_controller 

但我得到这个错误:

<top (required)>': undefined local variable or method `method_in_application_controller' for main:Object (NameError) 

如何加载数据从数据库中application.rb文件?

谢谢。

+0

编辑答案添加一个如何做到这一点的例子,而不是简单地建议反对它 –

回答

3

真的,你不应该。更好的方法是将控制器方法重构到全局可访问的地方,例如config/initializers文件中的文件或application.rb本身。然后从控制器调用它。原因是控制器方法可以访问特殊变量,如requestparams,这些变量在别处不可用。所以这是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 

这将运行控制器动作,然而,假请求对象可能需要更改,具体取决于您的控制器要求正确运行的要求。

如果您坚持在整个应用程序中共享控制器方法,那么使用类方法可能更容易。这消除了构造虚假请求并实例化控制器的必要性。

相关问题