Railsアプリにサクッとdeviseを導入deviseを日本語化(devise-i18n-views) でメールも日本語化されていますが、メール本文(app/views/users/mailer/*.html.erb)を変更しても反映されなかったので、色々調べてみた。
翻訳ファイルを変更すれば文言は変えられるけど、構成変えられないので。

方法1(却下)

config/initializers/devise.rb

  # Configure the class responsible to send e-mails.
  # config.mailer = 'Devise::Mailer'
  config.mailer = 'Users::Mailer'

app/controllers/users/mailer.rb

class Users::Mailer < Devise::Mailer
end

メール送信で、Devise::Mailerが使われるのをUsers::Mailerに変える。
controllersに紐付く、view(app/views/users/mailer/)が使われるという事。
一見良さそうですが、ユーザーと管理者とかでモデルを分けている場合に切り替えられなさそう。
controllersの中でviewを切り替える実装も出来そうだが、ここだけ共通になるのは気持ち悪い。
Devise::Mailerをカスタマイズする場合は必要そうだけど、需要は少なそう。

方法2(採用)

config/initializers/devise.rb

  # ==> Scopes configuration
  # Turn scoped views on. Before rendering "sessions/new", it will first check for
  # "users/sessions/new". It's turned off by default because it's slower if you
  # are using only default views.
  # config.scoped_views = false
  config.scoped_views = true

スコープビューをオンにします(但し、ログインが遅くなる)と書いてありますね。
処理が増えるので遅くなるのは当然ですが、感じられる程でもないですし、スマートに使えるようになるので良さそう。

考察1

ふと思った。ページのview(app/views/users)が使われなくて、下記のように書いたのは何だったんだろう。

config/routes.rb

  devise_for :users, controllers: {
    registrations: 'users/registrations',
    sessions: 'users/sessions',
    passwords: 'users/passwords'
  }

下記のように消してみたが、ページのview(app/views/users)が使われた。スコープビューが効いている。
rails routesを見ても解るが、あくまでもviewのスコープなので、controllerのカスタマイズは出来なくなるという事。

  devise_for :users

考察2

ページでもそうだったが、メール本文も日本語ではなく、英語に戻る。viewに書いてあるそのもの。
つまり、devise-i18n-viewsが使えなくなった。ので削除。

Gemfile

gem 'devise-i18n-views'
$ bundle install

結局の所、ページだけでなく、メール本文も弄りたいので、viewにベタで日本語化するか、翻訳(I18n)で埋め込むかになるが、海外展開する場合、単に翻訳すればよいというものでもない場合も多いし(商圏や法律の違い)
すぐに使わないなら、両方の文言と整合性考えてが地味に時間が掛かるので、viewはベタ書きで良いと考えている。いざ対応する時に対象が明確。
controllerでレスポンス(Flashメッセージとか)をベタ書きするのは良くないので、I18n(config/locales/ja.ymlとか)で定義して渡してあげる。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です