2010-09-15 18 views
26

Der Versuch, die folgendeWie übergeben Sie Variablen an render_to_string?

@message = render_to_string (:sender => sender, :template => "template")   

Aber beim Zugriff auf @sender in Vorlage zu tun, es null erweist: NilClass. Überprüfe, ob ich die richtige Variable übergebe und es ist völlig in Ordnung. Vielleicht gibt es andere Möglichkeiten, Variablen an render_to_string zu übergeben?

Antwort

33

Es könnte die von Ihnen verwendete Syntax sein. Versuchen Sie, das :locals Argument:

@m = render_to_string :template => "template", :locals => {:sender => sender} 

Dann müssen Sie sender nur Zugang (ohne @) als lokalen Variable in der Vorlage.

+1

dies versucht. Gleiches Problem – Arty

+6

Sie haben gerade festgestellt, dass Sie in Ihrer Ansicht versucht haben, auf den Absender als "Absender" zuzugreifen. Nicht sicher über Ihren ursprünglichen Code, aber wenn Sie die lokale Syntax verwenden, wird es eine lokale Variable (keine Instanzvariable) und wird ohne die '@' –

+0

Ihre Lösung tatsächlich funktionieren. Sie können Locals wie angegeben übergeben und auf sie als lokale Variablen und nicht als Instanzvariablen zugreifen. – MrYoshiji

0

In Schienen 4.0.2 dies gearbeitet:

render_to_string(partial: 'path/to/partial', locals: { argument: 'value'} 
2

ich in render_to_string ein anderes Format von Teil zu machen versuchte. Die Sache, die wirklich für mich gearbeitet wurde:

render_to_string (: partial => 'partial_file.html': Einheimische => {: variable => Variable}: format =>: html)

wo der Name der Datei _partial_file.html.erb war.

1

Versuchen Sie folgendes:

ac = ActionController::Base.new() 
ac.render_to_string(:partial => 'path to your partial',:locals => {:varable => your variables}) 
5

Hier Jason Kim ‚s Lösung, die er in einem Kommentar schrieb, die für mich gearbeitet:

ActionController::Base.new.render_to_string(
    "user_mailer/welcome_email.html.erb", locals: { :@user => user} 
) 

Bitte beachten Sie die :@user => value Bit.


In Rails 5 (atm in Beta):

ApplicationController.render(
    file: 'path', 
    assigns: { foo: 'bar' } 
) 

More here

Verwandte Themen