17

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

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

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

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

4

4 回答 4

28

正如 ronalchn 指出的那样,这是renderthat 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 %>"

于 2014-09-17T07:07:26.243 回答
11

mail该方法中可用的所有选项都可以在http://api.rubyonrails.org/classes/ActionMailer/Base.html#method-i-mail找到。

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

实例变量是您要使用的。

于 2012-09-07T12:14:17.577 回答
4

在 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 %>

于 2018-02-03T12:08:50.213 回答
-1

您实际上可以将 locals 选项与邮件一起使用,只是有点令人困惑和不一致。

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

:locals => { :name => 'Jane' }

然后在模板中

Dear <%= @name %>,
于 2013-12-16T22:29:10.730 回答