我知道我可以定义实例变量,例如:
def user_register(username, email)
@username = username
@email = email
mail(:to => email, :subject => "Welcome!", :template_name => "reg_#{I18n.locale}")
end
但是,有没有办法使用本地变量,就像将:locals 传递给partials一样?
答案 0 :(得分:19)
正如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 %>"
答案 1 :(得分:10)
可以在http://api.rubyonrails.org/classes/ActionMailer/Base.html#method-i-mail找到mail
方法中提供的所有选项。
我们知道render
有一个:locals
选项。但是,我们可以看到:locals
没有mail
选项可用。因此,不,没有比使用实例变量更好的方法(除非你想使用像全局变量或持久数据库对象那样可怕的东西 - 不要这样做)。
实例变量就是您要使用的。
答案 2 :(得分:1)
你可以实际使用邮件的locals选项,这有点令人困惑,并且如何不一致。
使用:locals
后,您可以使用实例变量访问邮件模板中的这些本地人,例如
:locals => { :name => 'Jane' }
然后在模板中
Dear <%= @name %>,
答案 3 :(得分:1)
在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 %>