2012-05-28 14 views
5

Ich habe ein Szenario, in dem ich eine lange Nachricht mit meinem JSON zurückgeben möchte. Anstatt es mit einer String-Verkettung zu schreiben, würde ich lieber eine Vorlage erstellen, die ich in meinen JSON rendern kann. Im Folgenden wird der Code bin ich zur Zeit versucht:Rendern ERB Vorlage in RABL Vorlage

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 

alles wie erwartet funktioniert dieser Code das erste Mal ausgeführt wird, aber ich laufe das zweite Mal, dass ich es in Probleme laufen, weil sie sagt, eine fehlende Instanzvariable ist (was ich vermutete, wurde während des ersten Laufs generiert und zwischengespeichert).

nicht definierte Methode _app_views_invitation_mailer_rsvp_sms_text_erb___2510743827238765954_2192068340 für # (ActionView :: Template :: Fehler)

Gibt es eine bessere Art und Weise erb Vorlagen in Rabl zu machen?

Antwort

2

Sie könnten versuchen, ERB mit als Standalone, und nicht durch die Ansicht Renderer gehen, etwa so:

object @invitation 

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

binding ist eine Methode auf Object (durch das Modul Kernel) und es gibt die Bindung, die das hält aktuellen Kontext, die auch Instanzvariablen (@invitation in diesem Fall)

-Update beinhaltet:

Sie nicht wirklich wissen, ob dies wird Ihnen helfen, weiter (und ich erkannte auch mehr es war als ein Jahr her, seit du das geschrieben), aber hier ist eine andere Art und Weise ERB-Vorlagen in einer eigenständigen Art und Weise zu machen:

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

Wenn ich Zeit habe ich eigentlich diese mit Rabl versuchen sollte, .

Verwandte Themen