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初始化需要:
- 上下文,表示模板搜索路径
-
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)
上面是我正在处理的应用程序的代码片段。
-
@jdf
是erb
视图中要评估的对象。 - 在我的情况下,我需要渲染
xml
。 -
result
是一个字符串,可以保存或发送到您喜欢的任何地方。
从技术上讲, ActionMailer
是AbstractController::Base
的子类实现。 如果您想自己实现此function,您可能也希望inheritanceAbstractController::Base
。
这里有一篇很好的博客文章: https : //www.amberbit.com/blog/2011/12/27/render-views-and-partials-outside-controllers-in-rails-3/ ,解释了所需的步骤。
为了将来参考,我最终找到了这个方便的gem,使这变得轻而易举:
“我正在尝试使用视图创建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)