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

时间:2012-09-07 11:14:17

标签: 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

但是,有没有办法使用本地变量,就像将:locals 传递给partials一样?

4 个答案:

答案 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 %>

即可在电子邮件模板中访问它们