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

Dmi*_*tri 15 ruby ruby-on-rails erb actionmailer local-variables

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

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

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

但是,有没有办法使用局部变量,就像传递:locals到partials?

rap*_*1ds 23

作为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
Run Code Online (Sandbox Code Playgroud)

现在你应该可以使用了 "Hello <%= recipient_name %>"


ron*_*chn 11

mail方法中提供的所有选项均可在http://api.rubyonrails.org/classes/ActionMailer/Base.html#method-i-mail中找到.

我们知道render有一个:locals选择.但是我们可以看到没有:locals可用的选项mail.因此,不,没有比使用实例变量更好的方法(除非你想使用类似全局或持久数据库对象的东西 - 不要这样做).

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