在RABL模板中渲染ERB模板

时间:2012-05-28 23:17:51

标签: ruby-on-rails erb rabl

我有一个场景,我想用我的JSON传回一条长信息。而不是用字符串连接写出来,我宁愿把一个erb模板放在一起,我可以渲染到我的JSON中。以下是我目前正在尝试的代码:

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

第一次运行此代码时,一切都按预期工作,但是,第二次运行时遇到问题,因为它说有一个缺少的实例变量(我假设在第一次运行时生成并缓存)。

  

未定义的方法   _app_views_invitation_mailer_rsvp_sms_text_erb___2510743827238765954_2192068340   for#(ActionView :: Template :: Error)

有没有更好的方法将erb模板渲染成rabl?

1 个答案:

答案 0 :(得分:2)

您可以尝试将ERB作为独立使用,而不是通过视图渲染器,如下所示:

object @invitation

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

binding是Object上的一个方法(通过内核模块),它返回包含当前上下文的绑定,其中还包含实例变量(在这种情况下为@invitation

<强>更新

真的不知道这是否会帮助你进一步(我也意识到你发布这个已经超过一年了),但这是另一种以独立方式呈现ERB模板的方法:

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

如果我有时间,我应该和Rabl一起尝试。