ActionMailer でテンプレートを指定する2009/08/11

ActionMailer のRDocでは何故か解説が無いようですが

Model側で

class FooMailer < ActionMailer::Base
  def bar
    from 'foobar@example.com'
    recipients 'foobar@example.com'
    
    template 'hoge'
    body :mes1 => 'hogehoge', :mes2 => 'foobar'
  end
end

FooMailer.create_bar # foo_mailer/bar.erb ではなく foo_mailer/hoge.erbが使用される

と、templateメソッドを利用すると、当該のメールがcreate!される際のテンプレートが明示的に指定できます。 引数は、APP_ROOT/app/views/foo_mailer からの相対パスです。 拡張子は、例のルールで補完されます。

テンプレートをファイルではなく String で与えたい場合に適切なメソッドは無いのですが、 ActionMailer::Base#create! は実行された際、@body が 既にStringのインスタンスならレンダリング処理はスキップして @body の内容をそのままメール本文とするようです。

class FooMailer < ActionMailer::Base
  def piyo
    from 'foobar@example.com'
    recipients 'foobar@example.com'
    
    body 'piyo piyo'
  end
end

FooMailer.create_piyo.body #=> 'piyo piyo'

あとは、自前でerbのコンパイルをするか、 ActionController::Base#render に、:inlineを与えたときのようなメソッドを実装すればいけるはず。 (ActionMailer::Base#render はファイル名しか取れない)

とりあえず、今日はここまで

コメント

コメントをどうぞ

※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

※なお、送られたコメントはブログの管理者が確認するまで公開されません。

名前:
メールアドレス:
URL:
コメント:

トラックバック

このエントリのトラックバックURL: http://dragonstar.asablo.jp/blog/2009/08/11/4504868/tb

※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。