Rails + 名前空間付きのActionMailerを使う場合に、件名をi18nのロケールファイルで指定してみた

Railsガイドによると、Action Mailer の件名は

mailメソッドに件名が渡されなかった場合、Action Mailerは既存の訳文の利用を試みます。「<mailer_scope>.<action_name>.subject」というパターンでキーが構築されます。

4.6 Action Mailerメールの件名を訳文に置き換える | Rails 国際化 (i18n) API - Railsガイド

となります。

ただ、

module Foo
  class BarMailer < ApplicationMailer
# ...

のような名前空間付きのAction Mailerの場合、ロケールファイルではどのように指定すればよいか迷ったためメモを残します。

 

目次

 

環境

 

名前空間付きのAction Mailerに対するロケールファイルの書き方

例えば

module Foo
  class BarMailer < ApplicationMailer
    def hello
      mail(to: 'baz@example.com')
    end
  end
end

というAction Mailerに hello というメソッドがあり、Controllerで

class HomeController < ApplicationController
  def index
    Foo::BarMailer.hello.deliver_now
  end
end

のように呼ぶとします。

 
この場合は、 config/locales/en.yml などのロケールファイルに

en:
  hello: "Hello world"
  foo:
    bar_mailer:
      hello:
        subject: My Subject

と、module Foo に対して1階層 foo を用意します。

 
ちなみに、Controllerでの呼び出しでは

::Foo::BarMailer.hello.deliver_now

でも良いです。

先頭の :: については、以下が参考になりました。

 
さらに、以降も余談を続けます。

 

Mailerのメソッドがネストしている場合

例えば、Action Mailerが

module Foo
  class BarMailer < ApplicationMailer
    def hey
      send_mail
    end

    def send_mail
      mail(to: 'send_mail@example.com')
    end
  end
end

と、 hey メソッドの中で別のpublicなメソッド send_mail を呼び出しているとします。

また、Controllerでは

class HomeController < ApplicationController
  def index
    Foo::BarMailer.hey.deliver_now
  end
end

hey メソッドを呼ぶとします。

 
この時、件名に対応するロケールファイルのキーは

  • hey
  • send_mail

のどちらになるか迷いました。

 
試してみたところ、ロケールファイルでは

en:
  hello: "Hello world"
  foo:
    bar_mailer:
      hey:
        subject: Hey subject

と、Controllerで呼ぶ時のメソッド名 hey をキーとして作れば良さそうです。

 

Mailerに対するロケールファイルのキーが存在しない場合

例えば

module Foo
  class BarMailer < ApplicationMailer
    def no_subject
      mail(to: 'no_subject@example.com')
    end
  end
end

というメソッド no_subject があるものの、ロケールファイルにキーが存在しない場合はどうなるか気になりました。

 
この時はメソッドの名前が件名に使われるようです。

 

ソースコード

Githubに上げました。
https://github.com/thinkAmi-sandbox/rails_i18n_app