如何手动运行Rails控制器操作("离线")?

时间:2018-01-10 19:43:07

标签: ruby-on-rails ruby-on-rails-4

我需要一种方法来手动运行控制器操作"离线"并存储结果输出。

考虑控制器初始化,似乎没有什么有趣的事情发生。

调查send_action,似乎在调用它时,控制器实例已经了解了很多动作! (例如@_action_name@_env,etv ...已经设置!)。

我需要了解发生的位置,以便我可以手动执行控制器实例。我从来没有想过如何将代码导航为像Rails一样动态,并且似乎无法找出这种设置发生的位置。我已经在一些地方使用了caller来了解如何调用操作,但却找不到我正在寻找的代码。

感谢任何帮助。

1 个答案:

答案 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;