Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/53.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails-如何在application.rb中使用来自控制器的方法?_Ruby On Rails_Ruby - Fatal编程技术网

Ruby on rails Rails-如何在application.rb中使用来自控制器的方法?

Ruby on rails Rails-如何在application.rb中使用来自控制器的方法?,ruby-on-rails,ruby,Ruby On Rails,Ruby,我在ApplicationController中有一个简单的方法,可以调用数据库并加载一些数据。我需要在application.rb中运行它,如下所示: MY_CONST = method_in_application_controller controller = PagesController.new controller.request = FakeRequest.new controller.root 但我得到了这个错误: <top (required)>': undef

我在
ApplicationController
中有一个简单的方法,可以调用数据库并加载一些数据。我需要在
application.rb
中运行它,如下所示:

MY_CONST = method_in_application_controller
controller = PagesController.new
controller.request = FakeRequest.new
controller.root
但我得到了这个错误:

<top (required)>': undefined local variable or method `method_in_application_controller' for main:Object (NameError)
':未定义的局部变量或main:Object(NameError)的方法“应用程序中的方法”或“控制器”
如何从
application.rb
文件中的数据库加载数据


谢谢。

真的,你不应该。更好的方法是将控制器方法重构到全局可访问的地方,例如
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\u action
,它引用了
会话
。这两个对象都是在
请求
对象上定义的,我可以这样“模拟”它:

可以这样使用:

MY_CONST = method_in_application_controller
controller = PagesController.new
controller.request = FakeRequest.new
controller.root
这将运行控制器操作,但是可能需要根据控制器正常运行所需的更改假请求对象


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

编辑答案,以添加一个如何执行此操作的示例,而不是简单地建议不要这样做