インスタンス変数を定義できることはわかっています。
def user_register(username, email)
@username = username
@email = email
mail(:to => email, :subject => "Welcome!", :template_name => "reg_#{I18n.locale}")
end
しかし、:localsをパーシャルに渡すのと同じように、代わりにローカル変数を使用する方法はありますか?
インスタンス変数を定義できることはわかっています。
def user_register(username, email)
@username = username
@email = email
mail(:to => email, :subject => "Welcome!", :template_name => "reg_#{I18n.locale}")
end
しかし、:localsをパーシャルに渡すのと同じように、代わりにローカル変数を使用する方法はありますか?
ronalchn が指摘したように、メソッドではなく、render
を持っているのです。したがって、ローカルを渡すには、メソッドに直接アクセスする必要があります。:locals
mail
render
にブロックを与えると、次のよう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 %>"
mail
メソッドで使用できるすべてのオプションは、 http://api.rubyonrails.org/classes/ActionMailer/Base.html#method-i-mailにあります。
オプションがあることはわかってrender
い:locals
ます。:locals
ただし、 に使用できるオプションがないことがわかりますmail
。したがって、いいえ、インスタンス変数を使用するよりも良い方法はありません (グローバルや永続的なデータベース オブジェクトなどの恐ろしいものを使用したい場合を除き、これを使用しないでください)。
インスタンス変数は、使用するものです。
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 %>
実際にはメールで locals オプションを使用できますが、その方法については少し混乱し、一貫性がありません。
一度使用:locals
すると、インスタンス変数を使用してメールテンプレートでこれらのローカルにアクセスできます。
:locals => { :name => 'Jane' }
そしてテンプレートで
Dear <%= @name %>,