2017-07-14 1 views
0

Ich versuche, eine HTML-Datei auf unser Dateisystem zu schreiben, so dass es gezippt und verschickt werden kann, zusammen mit einigen anderen Sachen.Rails 2.2.2: Render eine Vorlage mit Ertrag, in einem Modell

Ich habe eine erb Vorlage, die ich verwenden möchte, in unserem Ordner app/views/layouts. Diese Vorlage hat einen Standard-Aufruf <%= yield %>, und in diesem Fall habe ich eine Reihe von vorgenerierten HTML, als String in meiner Methode, die ich mit Ertrag ersetzen möchte.

Also, ich brauche so etwas wie dieser (Pseudo-Code) zu tun:

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 

Es könnte einfacher sein, für mich nur versuchen <%= yield %> gsub und ersetzen es mit meinem Text, aber das fühlt sich an wie ein Polizist out ...

Btw, wenn es einfacher ist, das Ergebnis als String zu erhalten, zB render_to_string, und es dann selbst in eine Datei schreiben, ist das in Ordnung. Es ist die Auswertung der Vorlage mit der Ausbeute innerhalb, die ich nicht bekomme ...

EDIT: Ich habe versucht, <%= yield %> zu <%= @content %> zu ändern, und dann dies tun, aber sie beide einen Fehler "geschützte Methode Anruf" :

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} 

Antwort

1

Try this:

<h1>My template</h1> 
<div>Foo: <%= foo %></div> 
0:

ActionView::Base.new(ActionController::Base.view_paths). 
    render(template: "your/template", locals: { foo: "bar" }) 

diese erfolgreich die Vorlage bei views/your/template.html.erb machen sollte

0

landete ich es wie folgt tun:

ich die Vorlage geändert, so dass anstelle eines von <%= yield %> Block, ich hatte

<%= @content %> 

ich es dann wie folgt aufgerufen:

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 ist der Status des aktuellen Bereichs (dh mit den gleichen Variablen usw.), also verwendet er den @content, den ich gerade definiert habe. Dies ist wahrscheinlich nicht der sauberste Weg, und es ist nicht ganz das, wonach ich gefragt habe, aber ich dachte, ich würde es hier als Antwort auf jeden Fall belassen. Ich bin immer noch neugierig zu wissen, ob es mit der <%= yield %> getan werden kann, anstatt eine Instanz var (wie ich habe) oder eine lokale var (wie Máté Solymosi die Antwort).

Verwandte Themen