2012-05-28 15 views
5

Ho uno scenario in cui mi piacerebbe passare un messaggio lungo con il mio JSON. Invece di scriverlo con una concatenazione di stringhe preferirei mettere insieme un modello di erb che posso renderizzare nel mio JSON. Di seguito è riportato il codice Attualmente sto cercando:Modello ERB di rendering in modello RABL

object @invitation 

node(:phone_message) do |invitation| 
    begin 
    old_formats = formats 
    self.formats = [:text] # hack so partials resolve with html not json format 
    view_renderer.render(self, {:template => "invitation_mailer/rsvp_sms", :object => @invitation}) 
    ensure 
    self.formats = old_formats 
    end 
end 

Tutto funziona come previsto la prima volta che questo codice viene eseguito, invece, mi imbatto in problemi la seconda volta che corro perché dice che c'è una variabile di istanza manca (che presumo sia stato generato e memorizzato nella cache durante la prima esecuzione).

metodo non definito _app_views_invitation_mailer_rsvp_sms_text_erb___2510743827238765954_2192068340 per # (ActionView :: Template :: Error)

C'è un modo migliore per rendere i modelli di erb in Rabl?

risposta

2

Si potrebbe provare a utilizzare ERB come stand-alone, e non passare attraverso il renderer vista, in questo modo:

object @invitation 

node(:phone_message) do |invitation| 
    begin 
    template = ERB.new(File.read("path/to/template.erb")) 
    template.result(binding) 
    end 
end 

binding è un metodo su Object (attraverso il modulo Kernel) e restituisce il legame che tiene il contesto attuale, che comprende anche variabili di istanza (@invitation in questo caso)

Aggiornamento:

in realtà non so se questo vi aiuterà a ottenere ogni ulteriore (e ho anche capito che è stato più di un anno da quando hai postato questo), ma qui è un altro modo per rendere i modelli di ERB in modo autonomo:

view = ActionView::Base.new(ActionController::Base.view_paths, {}) 

class << view 
include ApplicationHelper 
include Rails.application.routes.url_helpers 
end 
Rails.application.routes.default_url_options = ActionMailer::Base.default_url_options 
view.render(:file => "path/to/template.html.erb", :locals => {:local_var => 'content'}) 

Quando ho tempo dovrei effettivamente provare questo con Rabl .