2012-05-28 10 views
5

Tengo un escenario en el que me gustaría devolver un mensaje largo con mi JSON. En lugar de escribirlo con concatenación de cadenas, prefiero armar una plantilla erb que pueda renderizar en mi JSON. A continuación se muestra el código actualmente estoy tratando:Renderizar plantilla ERB en plantilla 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 

Todo funciona como se espera la primera vez que se ejecuta este código, sin embargo, me encuentro con problemas la segunda vez que corro porque dice que hay una variable de instancia que faltan (que supongo que fue generado y almacenado en caché durante la primera ejecución).

método no definido _app_views_invitation_mailer_rsvp_sms_text_erb___2510743827238765954_2192068340 para # (ActionView :: :: Plantilla de error)

¿Hay una mejor manera de hacer que las plantillas erb en Rabl?

Respuesta

2

Usted podría tratar de usar ERB como autónomo, y no pasa por el punto de vista de render, así:

object @invitation 

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

binding es un método en el objeto (a través del módulo del kernel) y devuelve la unión que mantiene la contexto actual, que también incluye las variables de instancia (@invitation en este caso)

actualización:

no se sabe muy bien si esto le ayudará a conseguir más lejos (y también me di cuenta de que han pasado más de un año desde que ha publicado esto), pero aquí hay otra manera de hacer que las plantillas de ERB en un modo autónomo:

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'}) 

Cuando tengo tiempo que debería realmente probar esto con Rabl .

Cuestiones relacionadas