ActionMailer передает локальные переменные в шаблон erb

Я знаю, что могу определить переменные экземпляра, например:

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

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

Но есть ли способ вместо этого использовать локальные переменные, как и для передачи: locals to partials?

Ответ 1

Все параметры, доступные в методе mail, можно найти на http://api.rubyonrails.org/classes/ActionMailer/Base.html#method-i-mail.

Мы знаем, что render имеет опцию :locals. Однако мы видим, что для mail нет опции :locals. Поэтому нет, нет лучшего способа использовать переменные экземпляра (если вы не хотите использовать что-то отвратительное, как глобальные или постоянные объекты базы данных - не делать этого).

Переменные экземпляра - это то, что вы должны использовать.

Ответ 2

Как указывал Рональч, он render, который имеет :locals, а не метод mail. Таким образом, вам нужен прямой доступ к методу render, чтобы передать локали.

Вы можете предоставить блок mail и таким образом получить доступ к методу render, примерно так:

mail(to: "[email protected]", subject: "Test passing locals to view from mailer") do |format|
  format.html {
    render locals: { recipient_name: "John D." }
  }
end

И теперь вы сможете использовать "Hello <%= recipient_name %>"

Ответ 3

Вы можете использовать параметр locals с почтой, это немного запутанно и непоследовательно в отношении того, как.

После использования :locals вы можете получить доступ к этим локалям в почтовом шаблоне с использованием переменных экземпляра, например.

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

а затем в шаблоне

Dear <%= @name %>,

Ответ 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 %>