4

(データベース内の) メール モデルの body 属性を使用してメールをレンダリングするための Action Mailer セットアップがあります。本文で erb を使用できるようにしたいのですが、送信された電子メール メッセージでレンダリングする方法がわかりません。

このコードで本体を文字列として取得できます

# models/user_mailer.rb
def custom_email(user, email_id)
  email = Email.find(email_id)

  recipients    user.email
  from          "Mail It Example <admin@foo.com>"
  subject       "Hello From Mail It"
  sent_on       Time.now

  # pulls the email body and passes a string to the template views/user_mailer/customer_email.text.html.erb
  body          :msg => email.body
end

この記事http://rails-nutshell.labs.oreilly.com/ch05.htmlに出くわしましたが、使用できると書かれていますが、作業renderすることしかできずrender :text、作業することはできませんrender :inline

# models/user_mailer.rb
def custom_email(user, email_id)
  email = Email.find(email_id)

  recipients    user.email
  from          "Mail It Example <admin@foo.com>"
  subject       "Hello From Mail It"
  sent_on       Time.now

  # body          :msg => email.body
  body          :msg => (render :text => "Thanks for your order")  # renders text and passes as a variable to the template
  # body          :msg => (render :inline => "We shipped <%= Time.now %>")  # throws a NoMethodError

end

更新:initialize_template_class誰かがこのスレッドhttp://www.ruby-forum.com/topic/67820での使用を推奨しました。私は今これを持っていますbody

body          :msg => initialize_template_class(:user => user).render(:inline => email.body)

それは機能しますが、私はこれを理解していないので、プライベートメソッドを調査してみましたが、これはハックであり、おそらくもっと良い方法があるのではないかと心配しています。 提案?

4

3 に答える 3

6

結局render:inlineを使用できなくなった場合でも、いつでも自分でERbをインスタンス化できます。

  require 'erb'

  x = 42
  template = ERB.new <<-EOF
    The value of x is: <%= x %>
  EOF
  puts template.result(binding)

  #binding here is Kernel::binding, the current variable binding, of which x is a part.
于 2010-05-03T19:04:20.887 に答える
6

Rails 3.2 では、render の :inline メソッドは問題なく動作します。

  mail(:to => "someemail@address.com",
       :subject => "test") do |format|
    format.text { render :inline => text_erb_content }
    format.html { render :inline => html_erb_content }
  end
于 2012-01-29T19:44:32.863 に答える
2

ティムの提案は正しい道を進んでいます。電子メール アクションで ERB を実装する方法は次のとおりです。

def custom_email(user, email_id)
  email = Email.find(email_id)
  # more email setup ...
  body            :msg => ERB.new(email.body).result(binding)
  # or ...
  # body            :msg => ERB.new(email.body).result(user.send(:binding))
end

2 つのハッシュの違いによって、データベース テーブルの body 属性で使用する erb が決まります。最初に、使用<%= user.name %>にアクセスするために使用する必要があります。秒であなたができること<%= name %>

于 2010-05-04T22:06:10.823 に答える