5

JSON で長いメッセージを返したいシナリオがあります。文字列連結で書き出す代わりに、JSON にレンダリングできる erb テンプレートをまとめたいと思います。以下は私が現在試しているコードです:

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

このコードを最初に実行したときはすべてが期待どおりに機能しますが、2 回目に実行すると問題が発生します。これは、インスタンス変数が欠落していると表示されるためです (最初の実行時に生成され、キャッシュされたと想定します)。

未定義のメソッド _app_views_invitation_mailer_rsvp_sms_text_erb___2510743827238765954_2192068340 # (ActionView::Template::Error)

erb テンプレートを rabl にレンダリングするより良い方法はありますか?

4

1 に答える 1

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オブジェクトのメソッドであり(カーネルモジュールを介して)、現在のコンテキストを保持するバインディングを返します。これにはインスタンス変数も含まれます(@invitationこの場合)

アップデート:

これがさらに役立つかどうかはわかりませんが (これを投稿してから 1 年以上経っていることにも気付きました)、スタンドアロンの方法で 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 でこれを試してみる必要があります。

于 2013-03-14T12:16:28.187 に答える