【问题标题】: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 文件,我宁愿远离它。

【问题讨论】:

  • 假的 ActionView::Base 怎么样?

标签: 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(...)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-04
        • 1970-01-01
        • 2013-05-23
        • 2021-08-17
        • 2015-02-01
        相关资源
        最近更新 更多