Как передать локаль ActiveJob / SuckerPunch при отправке отложенного письма?
В своем приложении Rails 5 я пытаюсь отправлять электронные письма с помощью ActiveJob и Sucker Punch:
# app/controllers/users_controller.rb
class UsersController < ApplicationController
def activate
user = User.find_by(:activation_token => params[:id])
user.activate
SendFollowUpEmailJob.perform_in(30, user)
sign_in user
end
end
# app/jobs/send_follow_up_email.rb
class SendFollowUpEmailJob < ActiveJob::Base
include SuckerPunch::Job
queue_as :default
def perform(user)
SupportMailer.follow_up(user).deliver_later
end
end
# app/mailers/support_mailer.rb
class SupportMailer < ApplicationMailer
layout nil
default :from => "admin@app.com"
def follow_up(user)
@user = user
mail :to => @user.email, :subject => t('.subject')
end
end
# app/views/user_mailer/activation.html.erb
<%= link_to(t('views.activate'), activate_user_url(@user.activation_token, :locale => "#{I18n.locale}")) %>
Все работает, за исключением того, что письмо всегда отправляется в локали по умолчанию, а не в локали, которая была передана в activate
действие.
Все электронные письма в приложении всегда отправляются в правильной локали, поэтому они должны быть либо ActiveJob, либо SuckerPunch.
Если вы можете помочь, пожалуйста, дайте мне знать. Благодарю.
1 ответ
Я знаком с I18n в приложении, но не так много в почтовиках. Помните, что почтовик отправляется за пределы запроса (ActiveJob), поэтому он ничего не знает о том, что там произошло. Похоже, что вы ничего не сделали, чтобы сообщить почтовой программе, что он должен отправлять данные в определенной локали....
ОК, может быть, это ответ для вас (и меня!) https://niallburkley.com/blog/localize-rails-emails/
I18n.with_locale(@user.locale) do
mail(
to: @user.email,
subject: I18n.t('user_mailer.new_follower.subject')
)
end