我需要一种方法来手动运行控制器操作"离线"并存储结果输出。
考虑控制器初始化,似乎没有什么有趣的事情发生。
调查send_action
,似乎在调用它时,控制器实例已经了解了很多动作! (例如@_action_name
,@_env
,etv ...已经设置!)。
我需要了解发生的位置,以便我可以手动执行控制器实例。我从来没有想过如何将代码导航为像Rails一样动态,并且似乎无法找出这种设置发生的位置。我已经在一些地方使用了caller
来了解如何调用操作,但却找不到我正在寻找的代码。
感谢任何帮助。
答案 0 :(得分:2)
我想通过离线运行你的意思是,通过rails控制台中的代码或某种lib或模型运行它。
您可以使用以下命令访问控制器信息:
<强> ActionDispatch::Integration::Session.new(Rails.application)
强>
这将创建一个新会话(类似于集成测试会话),您可以在其中执行对rails应用程序的请求。
您可以通过以下方式向您的操作/控制器执行请求:
<强> session.get(path)
强>
要捕获输出,您可以使用 session.response
中的值存储,如果您想获取正文,可以使用: session.response.body
强>
示例:
我们假设你有以下控制器:
# app/controllers/tests_controller.rb
class TestsController < ApplicationController
layout false
def index
@name = 'Test'
end
end
和以下观点:
# app/views/tests/index.html.erb
Hi <%= @name %>
以下路线:
# config/routes.rb
...
resources :tests, only: :index
...
您可以创建以下文件:
# run.rb
session = ActionDispatch::Integration::Session.new(Rails.application)
path = Rails.application.routes.url_helpers.tests_path
session.get(path)
puts session.response.body
并通过以下方式运行: rails runner run.rb
,您应该进行测试&#39;