1

我正在制作一个 gem,它将在 Rails 项目的 public/ 目录中生成一个 .html 文件。它将用于从 Cucumber 场景中自动生成文档。

能够将 HTML 文件模板化为 ERB 对我来说非常方便,这样我就可以传入变量,让 ERB 做这件事,然后吐出原始 HTML 来生成文件。

我知道ActionController::Base#render_to_string,但在 gem 中,我显然不在此方法的范围内。还有另一种方法可以做到这一点吗?我的另一个选择是在 heredoc 中定义标记,但如果可以只编写 ERB 文件,我宁愿远离它。

4

3 回答 3

3

如果您想访问各种帮助程序,请考虑使用 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>
于 2013-12-06T18:05:54.913 回答
1
ActionView::Base.new(Rails.configuration.paths["app/views"].first).render(...)
于 2013-01-11T16:33:05.433 回答
1
require 'erb'
ERB.new("Hello <%= 'World'%>").result

您可以将模板文件读入字符串,使用新的 ERB 实例进行渲染,然后编写静态 HTML。

如果需要使用变量,可以提供绑定。

foo = :bar
ERB.new("Hello <%= foo%>").result(binding) # "Hello bar"

ERB 文档

ERB#结果

于 2013-01-11T16:29:49.220 回答