Deviseで特定のステータスのユーザーにログインさせない方法とエラーの日本語化(Rails)
Deviseを使っていたRailsアプリケーションで、ログイン情報としてIDとパスワードとは別に、特定の条件をユーザーが満たす場合にそのユーザーのログインを許可したくない場面があり、その際の制御と日本語表示を学んだので備忘として記載します。
やりたいこと
ユーザーはメールとパスワードでログイン可否の認証を行なっている。
しかしながら、ユーザーテーブルにはロック状態かどうかを判定するカラムがあり、ユーザーがロックされている場合にはログインさせたくない。
また、エラーメッセージを日本語化したい。
1. ユーザーにログインさせない方法
結論:Deviseが用意しているactive_for_authentication?
メソッド を使う
def active_for_authentication?
super && active? # ユーザーがログインするためには、active?がtrueを返すことも必要
end
2. エラーメッセージの制御
結論:inactive_message
メソッドを使う
def inactive_message
active? ? super : :account_inactive # active?がfalseの時はdevise.
end
日本語化ファイル(devise.ja.yml)で日本語エラーを記載
devise:
failure:
account_inactive: 'ロックされているためログインできません'
3. エラーメッセージに引数を渡したい
ユーザーカラムでは別でname
カラムを持っており、エラーメッセージは、例えばname
がrubyという人なら、
「rubyさんはロックされているためログインできません」といったエラーメッセージを表示したい。
結論:deviseのロケールではなく別のロケールで記述する
def inactive_message
# :account_inactiveから修正
active? ? super : I18n.t('flash_message.inactive_user', name: name)
end
devise.ja.yml
の方に向ける方法で記載できるのかなーと思って試したり調べたりしましたが、出来なさそうだったので大人しくja.yml
に記載しました。
(こうやればできる、というのがあればぜひ教えてください)
ja:
flash_message:
# nameを受け取りたいなら%{name}と記載する
inactive_user: "%{name}さんはロックされているためログインできません"
参考
ここまで書いて、この記事のほとんどは以下の記事に綺麗にまとめられていることを発見しました。
RailsのDeviseで特定の条件のアカウントをログインさせなくする
Author And Source
この問題について(Deviseで特定のステータスのユーザーにログインさせない方法とエラーの日本語化(Rails)), 我々は、より多くの情報をここで見つけました https://qiita.com/m-ito27/items/ddf79b7ec7752168f976著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .