执行任意rails 4控制器动作,渲染到字符串

时间:2014-10-06 13:46:05

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

在Rails 4中,如何执行任意控制器操作并将响应呈现给字符串?

这显然是一种不好的做法,但有些情况下很难避免:

  • 您正在制作动态呈现的pdf(或任何自包含响应)的脱机副本或电子邮件附件。
  • 上述回复涉及不受您控制或外部宝石的观点和控制者。
  • 前面提到的视图涉及使用相对路径和自定义模板渲染引擎的布局和数十个部分。

在某些情况下(从另一个控制器调用时),可以通过替换视图所需的任何数据来消除对控制器的依赖性。但是,这通常会破坏视图渲染,因为相对路径不能再传递给局部内的渲染函数(以及其他问题)。

1 个答案:

答案 0 :(得分:0)

所以我实际上并没有这样做。或类似的东西。

但我记得你可以为任意的rails操作获取Rack app对象。因此,您似乎可以使用该机架兼容接口来执行所有任意操作并在内部获得响应,而无需实际发出http请求。

围绕我隐约记得把各个部分组合在一起的东西,并得到了这个,我在一个非常简单的虚拟应用程序中尝试过,它似乎有效:

rack_env = Rack::MockRequest.env_for("/some/url?foo=bar")
rack_app = SomeController.action(:index)

(status, headers, rack_body) = rack_app.call(rack_env)
str = rack_body.body

我很惊讶需要在我认为是身体的东西上调用#body,不确定究竟发生了什么我想我不完全理解机架api。不确定MockRequest是否是构建请求的正确方法。不确定是否有更好的方法(但是3-4线也不错)。但它似乎确实有效。

(可能有一种方法可以让'正确'的方式工作,有足够的工作 - 例如有方法可以更改或添加到视图模板查找路径,将原始控制器的视图放在视图查找上路径,即使你是从一个新视图渲染模板。但我相信你会感到痛苦,老实说,在这种情况下不确定“正确”的做法是什么,我认为 Rack方法看似合理)