Rails:从外部控制器渲染视图

我正在尝试使用视图创建HTML字符串。 我想从一个不是控制器的类中渲染它。 如何在控制器外部使用rails渲染引擎? 与ActionMailer的做法类似?

谢谢!

Rails 5现在以更方便的方式支持这个,处理创建请求以及幕后的东西:

rendered_string = ApplicationController.render( template: 'users/show', assigns: { user: @user } ) 

这将呈现app/views/users/show.html.erb并设置@user实例变量,因此您无需对模板进行任何更改。 它自动使用ApplicationController指定的布局(默认情况下为application.html.erb )。

测试显示了一些额外的选项和方法。

您可以使用ActionView :: Base来实现此目的。

 view = ActionView::Base.new(ActionController::Base.view_paths, {}) view.render(file: 'template.html.erb') 

ActionView :: Base初始化需要:

  1. 上下文,表示模板搜索路径
  2. assigns哈希,为模板提供变量

如果您想包含帮助程序,可以使用class_eval来包含它们:

 view.class_eval do include ApplicationHelper # any other custom helpers can be included here end 

没有必要用太多的gem过度膨胀你的应用程序。 我们知道ERB已经包含在您的Rails应用程序中。

 @jdf = JDF.new @job = ERB.new(File.read(Rails.root + "app/views/entries/job.xml.erb")) result = @job.result(binding) 

上面是我正在处理的应用程序的代码片段。

  • @jdferb视图中要评估的对象。
  • 在我的情况下,我需要渲染xml
  • result是一个字符串,可以保存或发送到您喜欢的任何地方。

从技术上讲, ActionMailerAbstractController::Base的子类实现。 如果您想自己实现此function,您可能也希望inheritanceAbstractController::Base

这里有一篇很好的博客文章: https : //www.amberbit.com/blog/2011/12/27/render-views-and-partials-outside-controllers-in-rails-3/ ,解释了所需的步骤。

为了将来参考,我最终找到了这个方便的gem,使这变得轻而易举:

https://github.com/yappbox/render_anywhere

“我正在尝试使用视图创建HTML字符串。” – 如果您的意思是您在视图模板的上下文中,那么只需使用辅助方法或渲染部分。

如果您使用的是其他“Plain Old Ruby Object”,请记住,您可以直接使用ERB模块:

 erb = ERB.new("path/to/template") result = erb.result(binding) 

诀窍是获得“绑定”对象,该对象为模板中的代码提供上下文。 ActionController和其他Rails类免费公开它,但我找不到一个引用来解释它的来源。

http://www.ruby-doc.org/stdlib-2.2.0/libdoc/erb/rdoc/ERB.html#method-i-result

最好使用控制器渲染视图,因为它就是它们的用途, 然后将其转换为字符串,因为这是您的最终目标。

 require 'open-uri' html = open(url, &:read)