Railsでエラーメッセージを分かりやすい日本語にする
はじめに
はじめまして,遠藤和真です。
東京大学の修士過程を修了し,現在エンジニアとして働いています。
この記事では,RailsのAPIを開発する際,エラーメッセージを日本語化する方法について,誤っている記事も多く見かけたので,自分なりにまとめていきます。
また,日本人のエンドユーザーにフロントエンドでメッセージを表示することを考え,エラーメッセージを分かりやすくカスタマイズする方法も書いています。
Railsの国際化対応
Railsは2.2以降から国際化(i18n)gemが同梱されています。
詳しくはRailsガイドを参照してください。
そのため,多言語対応のためのGemの追加等は必要ありません。
例えば日本語化であれば,config/application.rb
に1行を追加するだけです。
class Application < Rails::Application
# 省略
config.i18n.default_locale = :ja # <-追加
# locales直下にファイルを置かずフォルダ分けする場合はパスを追加
# config.i18n.load_path += Dir[Rails.root.join("config", "locales", "**", "*.{rb,yml}").to_s]
end
今回用いるAPIの設定
さて,このRails APIでユーザー登録のAPIリクエストを受け取ることを考えます。
Userモデルがあり,User作成(新規登録)の際に以下の4項目
- name
- password
- password_confirmation
をPOST /users
で受け取ることとします。
この時,UserモデルのValidationに以下の内容が含まれているとします。
- すべて入力必須
- email,passwordは正規表現で形式チェック(passwordは英大文字,英小文字,数字がそれぞれ必要)
- passwordは8文字以上
- password_confirmationはpasswordとの一致が必要
とりあえずリクエストを投げてみる
この状態で
- name
- password
- password_confirmation
の4項目を全て空の状態で新規登録のAPIリクエストを投げると,次のようなエラーメッセージを受け取ることができます。
エラーメッセージが日本語になっていることが分かります。
しかしフロントエンドでこのメッセージを表示することを考えると,このメッセージには改善の余地があります。
僕が気になるのは主に2つです。
- 主語,目的語が日本語で得られないこと
- 「は不正な値です」というのが分かりづらいこと
主語,目的語を日本語で得る
先ほどemailについて「を入力してください。」というエラーメッセージを得ることができましたが,フロントエンドで最終的に「メールアドレスを入力してください。」と表示したい場合,どこかで「email=メールアドレス」という英語と日本語の対応を書くことになります。せっかくエラーメッセージを日本語対応できたので,バックエンド側でこの部分も書いてしまいましょう。
config/locales/ja.yml
というファイルを作成し,これからはここで日本語をカスタマイズしていくことにします。このパスであれば特に設定の必要なくRailsに見つけてもらえます。
まず,以下のように書くと,Userモデルのそれぞれのattributeについて,日本語訳を与えることができます。
ja:
activerecord:
attributes:
user:
name: "表示名"
password: "パスワード"
password_confirmation: "パスワード確認"
email: "メールアドレス"
これをエラーメッセージでフロントエンド側に送るため,エラーメッセージをカスタマイズします。
ja:
activerecord:
attributes:
user:
name: "表示名"
password: "パスワード"
password_confirmation: "パスワード確認"
email: "メールアドレス"
errors:
messages:
invalid: "%{attribute}が正しくありません。"
blank: "%{attribute}を入力してください。"
too_short: "%{attribute}は%{count}文字以上で入力してください。"
こんな感じで書いておくと,%{attribute}
の部分に日本語の「メールアドレス」などが代入されます。
また,invalid
という項目は実は気になっていたもう一つのポイントである,「は不正な値です」というメッセージと対応しています。
これにより,メールアドレスが正規表現のValidationを通らなかった場合,以前は「は不正な値です」というメッセージになってしまっていたところが,「メールアドレスが正しくありません」というメッセージになりました。
「パスワードが正しくありません」を修正する
メールアドレスと同様にパスワードについても「パスワードが正しくありません」というメッセージが表示されることとなりました。
しかしエンドユーザーがこのメッセージを受け取っても,その意味が上手く伝わりません。パスワードには英大文字,英小文字,数字がそれぞれ必要であるということをメッセージに含めたいです。
そこでオリジナルの項目を追加します。
ja:
activerecord:
attributes:
user:
name: "表示名"
password: "パスワード"
password_confirmation: "パスワード確認"
email: "メールアドレス"
errors:
messages:
invalid: "%{attribute}が正しくありません。"
blank: "%{attribute}を入力してください。"
too_short: "%{attribute}は%{count}文字以上で入力してください。"
# 以下オリジナル
wrong_password_confirmation: "パスワードが確認用と一致していません。"
password_invalid: "パスワードは英大文字,英小文字,数字を含めて設定してください。"
このメッセージを,modelファイルのValidationを記述している部分で参照することができます。
class User < ApplicationRecord
# 省略
validates :password, presence: true, length: { minimum: 8 }, format: { with: VALID_PASSWORD_REGEX, message: :password_invalid }, confirmation: { type: :password, message: :wrong_password_confirmation }
# 省略
end
これでエラーメッセージは画像のようになりました。これで良さそうです。
こうなるとフロントエンドの実装もしやすくなります。
最後に
いかがだったでしょうか。
この記事が皆さんの開発のお役に立てれば嬉しいです。
最後までお読み頂きありがとうございました!
Discussion