我试图将html文件写入我们的文件系统,因此可以将其压缩并发送出去,以及其他一些内容。
我想在我们的app/views/layouts
文件夹中使用一个erb模板。该模板中有一个标准的<%= yield %>
调用,在这个例子中,我有一堆预先生成的html,作为我方法中的字符串,我想用yield替换yield。
所以,我需要做这样的事情(伪代码):
string = "<div>This is some <strong>html</strong></div>"
erb_template = "app/views/layouts/my_layout.html.erb"
output_filename = "/tmp/output.html"
#something like this...
render_to_file(erb_template, output_filename) do
string
end
我可能更容易尝试只发布<%= yield %>
并将其替换为我的文字,但这感觉就像一个警察......
顺便说一句,如果它更容易将结果作为字符串获取,例如使用render_to_string
,然后自己将其写入文件,那很好。它是对模板的评估,其内部产量是我没有得到的......
编辑:我们已尝试将<%= yield %>
更改为<%= @content %>
,然后执行此操作,但他们都提出了#34;受保护的方法调用&#34;错误:
c = ActionController::Base.new()
html = c.render_to_string :template => erb_template, :layout => false, :locals => {:content => string}
c = ApplicationController.new()
html = c.render_to_string :template => erb_template, :layout => false, :locals => {:content => string}
答案 0 :(得分:1)
试试这个:
ActionView::Base.new(ActionController::Base.view_paths).
render(template: "your/template", locals: { foo: "bar" })
这应该成功地在views/your/template.html.erb
:
<h1>My template</h1>
<div>Foo: <%= foo %></div>
答案 1 :(得分:0)
我最终这样做了:
我更改了模板,而不是<%= yield %>
块,我有
<%= @content %>
然后我这样称呼它:
string = "<div>This is some <strong>html</strong></div>"
erb_template = "app/views/layouts/my_layout.html.erb"
output_filename = "/tmp/output.html"
template = ERB.new(File.read(erb_template))
@content = string
html = template.result(binding)
File.open(output_filename, "w"){|f| f.puts html}
binding
是当前范围的状态(即具有所有相同的变量等),因此它使用我刚刚定义的@content。这可能不是最干净的方式,并不是我要求的,但我想我还是把它留在这里作为答案。我仍然很想知道是否可以使用<%= yield %>
而不是使用实例var(比如我有)或本地var(比如MátéSolymosi的答案)。