我正在制作一个gem,它将在Rails项目的公共/目录中生成一个.html文件。它将用于自动从Cucumber场景生成文档。
对我来说,能够将HTML文件模板化为ERB是非常方便的,这样我就可以传入变量,让ERB做它的事情,然后吐出原始HTML来生成文件。
我知道ActionController::Base#render_to_string
,但在宝石中,我显然不在这种方法的范围之内。还有别的办法吗?我的另一个选择是在heredoc中定义标记,但如果可以只编写ERB文件,我宁愿避免这样做。
如果你想访问各种帮助器,考虑使用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>
require 'erb'
ERB.new("Hello <%= 'World'%>").result
您可以将模板文件读入字符串,用新的ERB实例呈现,然后编写静态HTML。
如果你需要使用变量,你可以提供绑定。
foo = :bar
ERB.new("Hello <%= foo%>").result(binding) # "Hello bar"
ERB文件
ERB #结果
ActionView::Base.new(Rails.configuration.paths["app/views"].first).render(...)