我知道我可以定义实例变量,例如:
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
that has :locals
,而不是mail
方法。因此,您需要直接访问该render
方法才能传递当地人。
您可以给 the 一个块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 %>,