【问题标题】:Can I render an ERB file to an HTML string inside of a gem (outside of ActionController::Base)?我可以将 ERB 文件呈现为 gem 内的 HTML 字符串(在 ActionController::Base 之外)吗?
【发布时间】:2013-01-11 16:21:03
【问题描述】:
我正在制作一个 gem,它将在 Rails 项目的 public/ 目录中生成一个 .html 文件。它将用于从 Cucumber 场景中自动生成文档。
能够将 HTML 文件模板化为 ERB 对我来说非常方便,这样我可以传入变量,让 ERB 做这件事,然后吐出原始 HTML 来生成文件。
我知道ActionController::Base#render_to_string,但在 gem 中我显然不在此方法的范围内。还有另一种方法可以做到这一点吗?我的另一个选择是在 heredoc 中定义标记,但如果可以只编写 ERB 文件,我宁愿远离它。
【问题讨论】:
标签:
ruby-on-rails
ruby-on-rails-3
gem
erb
【解决方案1】:
如果您想访问各种帮助程序,请考虑使用 ActionView 而不是 ERB。这是一个完整的工作示例,说明如何执行此操作。
class MyClass
def test
render 'register_user', :jid => 'my login', :password => 'my password'
end
private
def render template, **values
templates_dir = "#{Rails.root}/app/lib/api"
template_file = "#{template}.xml.erb"
ActionView::Base.new(templates_dir).render \
:file => template_file,
:locals => values
end
end
模板位于app/lib/api,如下所示:
<query xmlns="archipel:xmppserver:users">
<archipel action="register">
<%= tag :user, :jid => jid, :password => password %>
</archipel>
</query>
【解决方案2】:
require 'erb'
ERB.new("Hello <%= 'World'%>").result
您可以将模板文件读入字符串,使用新的 ERB 实例进行渲染,然后编写静态 HTML。
如果需要使用变量,可以提供绑定。
foo = :bar
ERB.new("Hello <%= foo%>").result(binding) # "Hello bar"
ERB docs
ERB#result
【解决方案3】:
ActionView::Base.new(Rails.configuration.paths["app/views"].first).render(...)