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