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とか)で定義して渡してあげる。