Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Render ERB Template in RABL Template

I have a scenario where I'd like to pass back a long message with my JSON. Instead of writing it out with string concatenation I'd rather put together an erb template that I can render into my JSON. Below is the code I'm currently trying:

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

Everything works as expected the first time this code is run, however, I run into problems the second time I run it because it says there is a missing instance variable (which I assume was generated and cached during the first run).

undefined method _app_views_invitation_mailer_rsvp_sms_text_erb___2510743827238765954_2192068340 for # (ActionView::Template::Error)

Is there a better way to render erb templates into rabl?

like image 443
jachenry Avatar asked Nov 04 '22 23:11

jachenry


1 Answers

You could try using ERB as standalone, and not going through the view renderer, like so:

object @invitation

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

binding is a method on Object (through the Kernel module) and it returns the binding which holds the current context, which also includes instance variables (@invitation in this case)

Update:

Don't really know if this will help you get any further (and I also realised it's been more than a year since you posted this), but here's another way to render ERB templates in a standalone fashion:

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

When I have time I should actually try this with Rabl.

like image 115
Jure Triglav Avatar answered Nov 09 '22 14:11

Jure Triglav