Как передать локаль 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
Другие вопросы по тегам