⛩️

Railsでエラーメッセージを分かりやすい日本語にする

2022/06/08に公開

はじめに

はじめまして,遠藤和真です。
東京大学の修士過程を修了し,現在エンジニアとして働いています。

この記事では,RailsのAPIを開発する際,エラーメッセージを日本語化する方法について,誤っている記事も多く見かけたので,自分なりにまとめていきます。

また,日本人のエンドユーザーにフロントエンドでメッセージを表示することを考え,エラーメッセージを分かりやすくカスタマイズする方法も書いています。

Railsの国際化対応

Railsは2.2以降から国際化(i18n)gemが同梱されています。
詳しくはRailsガイドを参照してください。

そのため,多言語対応のためのGemの追加等は必要ありません。
例えば日本語化であれば,config/application.rbに1行を追加するだけです。

config/application.rb
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項目

  • email
  • name
  • password
  • password_confirmation

POST /usersで受け取ることとします。

この時,UserモデルのValidationに以下の内容が含まれているとします。

  • すべて入力必須
  • email,passwordは正規表現で形式チェック(passwordは英大文字,英小文字,数字がそれぞれ必要)
  • passwordは8文字以上
  • password_confirmationはpasswordとの一致が必要

とりあえずリクエストを投げてみる

この状態で

  • email
  • name
  • password
  • password_confirmation

の4項目を全て空の状態で新規登録のAPIリクエストを投げると,次のようなエラーメッセージを受け取ることができます。

エラーメッセージが日本語になっていることが分かります。

しかしフロントエンドでこのメッセージを表示することを考えると,このメッセージには改善の余地があります。

僕が気になるのは主に2つです。

  • 主語,目的語が日本語で得られないこと
  • 「は不正な値です」というのが分かりづらいこと

主語,目的語を日本語で得る

先ほどemailについて「を入力してください。」というエラーメッセージを得ることができましたが,フロントエンドで最終的に「メールアドレスを入力してください。」と表示したい場合,どこかで「email=メールアドレス」という英語と日本語の対応を書くことになります。せっかくエラーメッセージを日本語対応できたので,バックエンド側でこの部分も書いてしまいましょう。

config/locales/ja.ymlというファイルを作成し,これからはここで日本語をカスタマイズしていくことにします。このパスであれば特に設定の必要なくRailsに見つけてもらえます。

まず,以下のように書くと,Userモデルのそれぞれのattributeについて,日本語訳を与えることができます。

config/locales/ja.yml
ja:
  activerecord:
    attributes:
      user:
        name: "表示名"
        password: "パスワード"
        password_confirmation: "パスワード確認"
        email: "メールアドレス"

これをエラーメッセージでフロントエンド側に送るため,エラーメッセージをカスタマイズします。

config/locales/ja.yml
ja:
  activerecord:
    attributes:
      user:
        name: "表示名"
        password: "パスワード"
        password_confirmation: "パスワード確認"
        email: "メールアドレス"
    errors:
      messages:
	invalid: "%{attribute}が正しくありません。"
        blank: "%{attribute}を入力してください。"
	too_short: "%{attribute}は%{count}文字以上で入力してください。"

こんな感じで書いておくと,%{attribute}の部分に日本語の「メールアドレス」などが代入されます。

また,invalidという項目は実は気になっていたもう一つのポイントである,「は不正な値です」というメッセージと対応しています。
これにより,メールアドレスが正規表現のValidationを通らなかった場合,以前は「は不正な値です」というメッセージになってしまっていたところが,「メールアドレスが正しくありません」というメッセージになりました。

「パスワードが正しくありません」を修正する

メールアドレスと同様にパスワードについても「パスワードが正しくありません」というメッセージが表示されることとなりました。

しかしエンドユーザーがこのメッセージを受け取っても,その意味が上手く伝わりません。パスワードには英大文字,英小文字,数字がそれぞれ必要であるということをメッセージに含めたいです。

そこでオリジナルの項目を追加します。

config/locales/ja.yml
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を記述している部分で参照することができます。

app/models/user.rb
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