Rails 2.2.2:在模型中使用yield渲染模板

时间:2017-07-14 12:50:50

标签: ruby-on-rails erb yield

我试图将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}

2 个答案:

答案 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的答案)。