Ruby on rails ActionMailer将局部变量传递给erb模板

Ruby on rails ActionMailer将局部变量传递给erb模板,ruby-on-rails,ruby,actionmailer,erb,local-variables,Ruby On Rails,Ruby,Actionmailer,Erb,Local Variables,我知道我可以定义实例变量,例如: def user_register(username, email) @username = username @email = email mail(:to => email, :subject => "Welcome!", :template_name => "reg_#{I18n.locale}") end 但是,是否有一种方法可以使用local变量,就像将:local传递给partials一样?邮件方法中的所有可用选项都

我知道我可以定义实例变量,例如:

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

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

但是,是否有一种方法可以使用local变量,就像将:local传递给partials一样?

邮件
方法中的所有可用选项都可以在中找到

我们知道,
render
有一个
:locals
选项。但是,我们可以看到,对于
邮件
,没有可用的
:locals
选项。因此,没有比使用实例变量更好的方法了(除非您想使用一些可怕的东西,比如全局或持久数据库对象-不要这样做)


实例变量就是您要使用的。

实际上可以在邮件中使用locals选项,这只是有点混乱和不一致

使用
:locals
后,您可以使用实例变量访问邮件模板中的这些locals,例如

:locals => { :name => 'Jane' }
然后在模板中

Dear <%= @name %>,
亲爱的,

正如ronalchn指出的那样,是
渲染
产生了
:locals
,而不是
邮件
方法。因此,您需要直接访问
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

现在您应该能够在Rails 5中使用“Hello”

,只需在方法中使用
@
定义实例变量即可。为此,您不再有权访问
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
class UserMailerto_电子邮件,
:subject=>MAILER\u SUBJECTS\u欢迎您,
:template\u path=>“user\u mailer”,
:template_name=>“欢迎电子邮件”)
结束
结束

然后,您可以使用

确定在电子邮件模板中访问它们。谢谢我会用它们的!谢谢,@rap1ds我会尝试这种方法:)当然!不过,这应该在Rails2上进行测试,从那时起可能发生了一些变化。这在Rails4.2中不起作用。我不希望它基于其他答案。最好在答案中说明它与Rails的哪个版本一起工作。即使在Rails 5之前也是如此。