17

インスタンス変数を定義できることはわかっています。

def user_register(username, email)
  @username = username
  @email = email

  mail(:to => email, :subject => "Welcome!", :template_name => "reg_#{I18n.locale}")
end

しかし、:localsをパーシャルに渡すのと同じように、代わりにローカル変数を使用する方法はありますか?

4

4 に答える 4

28

ronalchn が指摘したように、メソッドではなく、renderを持っているのです。したがって、ローカルを渡すには、メソッドに直接アクセスする必要があります。:localsmailrender

にブロックを与えると、次のようmailにメソッドにアクセスできます。render

mail(to: "your_mail@example.com", subject: "Test passing locals to view from mailer") do |format|
  format.html {
    render locals: { recipient_name: "John D." }
  }
end

そして今、あなたは使用できるはずです"Hello <%= recipient_name %>"

于 2014-09-17T07:07:26.243 に答える
11

mailメソッドで使用できるすべてのオプションは、 http://api.rubyonrails.org/classes/ActionMailer/Base.html#method-i-mailにあります。

オプションがあることはわかってrender:localsます。:localsただし、 に使用できるオプションがないことがわかりますmail。したがって、いいえ、インスタンス変数を使用するよりも良い方法はありません (グローバルや永続的なデータベース オブジェクトなどの恐ろしいものを使用したい場合を除き、これを使用しないでください)。

インスタンス変数は、使用するものです。

于 2012-09-07T12:14:17.577 に答える
4

Rails 5 では@、メソッド内で を使用してインスタンス変数を定義するだけです。localsこの目的のためにプロパティにアクセスすることはできなくなりました。

class UserMailer < ApplicationMailer

  def welcome_email(user_id:, to_email:, user_full_name:, token:)    
    # Mail template variables
    @user = User.find_by(id: user_id)
    @token = token

    mail(:to => to_email,
       :subject => MAILER_SUBJECTS_WELCOME,
       :template_path => "user_mailer",
       :template_name => "welcome_email")
  end
end

<%= @user %>その後、メールテンプレートで と を使用してアクセスできます<%= @token %>

于 2018-02-03T12:08:50.213 に答える
-1

実際にはメールで locals オプションを使用できますが、その方法については少し混乱し、一貫性がありません。

一度使用:localsすると、インスタンス変数を使用してメールテンプレートでこれらのローカルにアクセスできます。

:locals => { :name => 'Jane' }

そしてテンプレートで

Dear <%= @name %>,
于 2013-12-16T22:29:10.730 に答える