- 更新日: 2016年11月8日
- Devise
Rails Devise でパスワードリセットなどのメールテンプレート(Mailer ビュー)をカスタマイズ
Devise の Mailer のテンプレートを独自にカスタマイズする方法です。パスワードリセット(Recoverable モジュール)の機能などで Devise の Mailer が利用されます。
— 環境 —
rails 5.0.0.1
devise 4.2
【追記 2016/11/08】
Rails 5 + Devise 4.2 の最新バージョンで正常に動作することを確認しました。
【追記ここまで】
— 記事初回公開時の環境 —
Rails 4.0.1
Devise 3.2.2
事前に Devise で使われるビューをカスタマイズするために、以下のコマンドを実行します。
1 2 3 |
$ bundle exec rails generate devise:views users |
詳しくは以下を参照。
Rails で Devise のビューを作成してカスタマイズ | EasyRamble
パスワードリセットのメールテンプレートを確認
app/views/users/mailer/reset_password_instructions.html.erb
1 2 3 4 5 6 7 8 |
<p><%= t(".title") %> <%= @resource.email %>!</p> <p><%= t(".reset_password_explanation") %></p> <p><%= link_to t(".reset_password_link"), edit_password_url(@resource, :reset_password_token => @token) %></p> <p><%= t(".please_ignore") %></p> <p><%= t(".wont_change") %></p> |
メールテンプレートは I18n での翻訳を前提として生成されています。ちなみに、このメールテンプレートを生成する generator は、以下のファイルが元のソースです。
devise3.2.2/lib/generators/templates/markerb/reset_password_instructions.markerb
I18n 用の yaml 翻訳ファイルを作成
生成されたメールのテンプレートを参考にして、以下のように日本語と英語の翻訳ファイルを作成します。
config/locales/views/users/mailer.ja.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
ja: users: mailer: confirmation_instructions: subject: "アカウントの登録方法" title: "ようこそ" confirm_explanation: "アカウント確認メールを以下のリンクから送信できます:" confirm_link: "アカウントを確認する" reset_password_instructions: subject: "パスワードの再設定" title: "こんにちは" reset_password_explanation: "パスワードリセットのリクエストが行われました。以下のリンクをクリックしてパスワードを変更できます。" reset_password_link: "パスワードを変更する" please_ignore: "もしあなたがパスワードリセットをリクエストしていない場合は、このメールを無視して下さい。" wont_change: "上記リンクをクリックして新しいパスワードを作成しない限り、パスワードは変更されません。" unlock_instructions: subject: "アカウントのロック解除" title: "こんにちは" locked_explanation: "ログイン失敗の回数が多すぎたために、あなたのアカウントはロックされました。" unlock_explanation: "あなたのアカウントのロックを解除するためには、以下のリンクをクリックして下さい:" unlock_link: "アカウントのロックを解除する" |
config/locales/views/users/mailer.en.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
en: users: mailer: confirmation_instructions: subject: "Confirmation instructions" title: "Welcome" confirm_explanation: "You can confirm your account email through the link below:" confirm_link: "Confirm my account" reset_password_instructions: subject: "Reset password instructions" title: "Hello" reset_password_explanation: "Someone has requested a link to change your password. You can do this through the link below." reset_password_link: "Change my password" please_ignore: "If you didn't request this, please ignore this email." wont_change: "Your password won't change until you access the link above and create a new one." unlock_instructions: subject: "Unlock Instructions" title: "Hello" locked_explanation: "Your account has been locked due to an excessive number of unsuccessful sign in attempts." unlock_explanation: "Click the link below to unlock your account:" unlock_link: "Unlock my account" |
私は Recoverable モジュール(reset_password_instructions)のみの利用ですが、一応 Confirmarable モジュール(confirmation_instructions)、Lockable モジュール(unlock_instructions)の分も翻訳しておきました。
カスタマイズ用の Mailer を作成
Mailer のテンプレートを独自に作成するだけだと動きません。ま、そりゃそうか。
ということで、モデル(ここでは User モデル)に合わせて独自の Mailer を Devise::Mailer を継承して作成します。
app/controllers/users/mailer.rb
1 2 |
class Users::Mailer < Devise::Mailer end |
Devise::Mailer は、devise-3.2.2/app/mailers/devise/mailer.rb に定義されている。とりあえずアクションに関しては、デフォルトのままで良いので継承するだけで中身はなし。
あとは、config/initializers/devise.rb で以下を設定します。
config/initializers/devise.rb
1 2 |
# config.mailer = 'Devise::Mailer' config.mailer = 'Users::Mailer' |
Mailer のアクションを独自にカスタマイズする場合は、以下のように Devise::Mailer のアクションをオーバーライドすれば良いです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
class Users::Mailer < Devise::Mailer helper :application # gives access to all helpers defined within `application_helper`. include Devise::Controllers::UrlHelpers # Optional. eg. `confirmation_url` def confirmation_instructions(record, token, opts={}) # customize super end def reset_password_instructions(record, token, opts={}) # customize super end def unlock_instructions(record, token, opts={}) # customize super end end |
以上で、Devise Mailer のテンプレートをカスタマイズできます。実際のメール送信確認や RSpec によるテストでも正常な動作を確認できました。Rails で ActionMailer を RSpec でテストするのは以下を参照。
ActionMailer のメール送信テストを RSpec で行う | EasyRamble
- Devise の関連記事
- RailsのDevise認証機能での実装チェックリストまとめ
- Deviseで送信されるメールのfrom(送信者メールアドレス)を変更
- Facebook の OAuth 認証で OAuthException(191)エラー
- Rails + Devise 環境でのフレンドリーフォワーディング機能を修正
- Deviseでユーザー登録完了時にウェルカムメールを送信する
- Rails Devise でユーザーがプロフィール情報を更新後に元のページにリダイレクトさせる
- Devise でユーザーがパスワードなしでアカウント情報を変更するのを許可
- Rails Deviseの日本語化辞書ファイル(devise.ja.yml)
- Rails + Devise で admin ユーザー(管理者)を削除できないようにする
- Devise3.2.2 のデフォルト設定では、Rememberable の remember_token のカラムがないのでソースを解読してみた
- 初回公開日: 2014年6月11日
Leave Your Message!