バグ #705
完了ログイン失敗時に devise.failure.invalid の Translation missing が表示される
0%
説明
事象¶
管理画面のログインでパスワードを間違えると、フラッシュに以下がそのまま表示される。
Translation missing. Options considered were: - ja.devise.failure.administrator.invalid - ja.devise.failure.invalid
curl で再現確認済み(POST /administrators/sign_in に誤ったパスワード → HTTP 422、上記文字列がレスポンスに含まれる)。
原因¶
config/locales/devise.ja.yml に定義されているのは以下の 4 キーのみで、failure.invalid が無い。
failure.unauthenticatedfailure.timeoutsessions.signed_insessions.signed_out
devise 標準(en)と比較すると 34 キーが未定義。ただし本アプリで有効な devise モジュールは
database_authenticatable(supplier のみ rememberable を追加)だけなので、
confirmable / recoverable / registerable / lockable / omniauthable 系のキーは不要。
対応(実際に到達しうるキーのみ追加すれば足りる)¶
| キー | 発生条件 |
|---|---|
failure.invalid |
パスワード誤り(今回の事象) |
failure.not_found_in_database |
該当メールアドレスが存在しない |
failure.already_authenticated |
ログイン済みでログイン画面にアクセス |
failure.inactive |
active_for_authentication? が false |
sessions.already_signed_out |
未ログインでログアウト |
注意点:
failure.invalid/failure.not_found_in_databaseは%{authentication_keys}を補間する。 補間を使うならja.devise.failure側で語を用意するか、補間を使わない文面 (例: 「メールアドレスまたはパスワードが正しくありません。」)にする。- scope 付きキー(
administrator/supplier/user)は未定義でも汎用キーにフォールバックするため、 汎用のみ定義すれば 3 スコープすべてで解決する(failure.unauthenticatedと同じ方針)。 - request spec でログイン失敗時のフラッシュ文言を検証しておくと再発を防げる。
参考¶
本間 紀史 さんが8日前に更新
PR を作成しました: https://github.com/init6/okinawan_eats/pull/125
ブランチ: task/705(develop へ rebase 済み・1 コミット)
テスト: bundle exec rspec 188 examples, 0 failures
本間 紀史 さんが8日前に更新
- ステータス を 進行中 から 終了 に変更
PR #125 を develop へマージしたため完了。
https://github.com/init6/okinawan_eats/pull/125
devise の日本語メッセージに failure.invalid ほか 4 キーを追加し、ログイン失敗時の Translation missing を解消した。あわせて request spec を 2 ケース追加。
CI が brakeman の --ensure-latest で落ちたため、同 PR 内で brakeman を 8.0.5 → 8.0.6 に更新している。