我可以把ERB文件渲染成gem中的HTML字符串(ActionController::Base之外)吗?



我正在制作一个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(...)

相关内容

  • 没有找到相关文章

最新更新