Udemy 8. ユーザーモデル開発 #03
2020年07月12日に公開

Railsバリデーションエラーメッセージの日本語化(ja.yml設定方法)

今回達成すること

バリデーションのエラーメッセージを日本語に対応するための設定を行います。

具体的には、「I18n(アイエイティーンエヌ)」モジュールが読み込むja.ymlファイルを編集します。

I18nとはRailsアプリを多言語化対応するためのモジュールで、同一コードでもユーザーに表示する言語を切り替ることができます。

ja.ymlファイルを作成する

この回application.rbに下記コードを追加しました。

config.i18n.default_locale = :ja

この設定をするとI18nは下記のファイルを読み込みます。

/config/locales/ja.yml

最初にI18n読み込みファイルja.ymlを作成します。

root $ touch api/config/locales/ja.yml

確認しておきましょう。

root $ ls -1 api/config/locales

en.yml
ja.yml

ja.ymlに日本語化対応を記述する

この設定を一から自分でやるのは大変ですので、Rails用の日本語化ファイルを作成している猛者の力を借ります。(感謝)

下記URLのファイル内容をコピーしてja.ymlに貼り付けてください。

rails-i18n/ja.yml at master · svenfuchs/rails-i18n - GitHub

api/config/locales/ja.yml
ja:
  activerecord:
    errors:
      messages:
        record_invalid: 'バリデーションに失敗しました: %{errors}'
        restrict_dependent_destroy:
          has_one: "%{record}が存在しているので削除できません"
          has_many: "%{record}が存在しているので削除できません"
  date:
    abbr_day_names:
    - 日
    - 月
    - 火
    - 水
    - 木
    - 金
    - 土
    abbr_month_names:
    - 
# ...以下省略

これだけでRailsが吐き出すメッセージのおおよそは日本語化できます。

ユーザーカラムの日本語化

ユーザーテーブルのカラム名を日本語化します。

この設定をしないと、バリデーションのエラーメッセージがヘンテコになってしまいます。

["Passwordを入力してください", "Nameを入力してください"]

2行目activerecord:の以下に2つのインデントをつけて下記を追加してください。

api/config/locales/ja.yml
ja:
  activerecord:
    # 追加
    attributes:
      user:
        name: 名前
        email: メールアドレス
        password: パスワード
        activated: アクティブフラグ
        admin: 管理者フラグ
    # ここまで

オリジナルエラーメッセージの追加

パスワードバリデーションのエラーメッセージを追加します。

ユーザーパスワードはこちらで書式を制限していますが、どの値が使えるのかユーザーには不明確です。

初期エラーメッセージの「不正な値です」だけではユーザーに次の行動を促せないため、「何が使えるのか」を具体的にメッセージ化します。


まずはja.ymlmessages:(117行目付近)の下に2インデントをつけてエラーメッセージを追加します。

api/config/locales/ja.yml
...
messages:
  invalid_password: は半角英数字•ハイフン•アンダーバーが使えます  # 追加
  accepted: を受諾してください

続いてuser.rbのパスワードバリデーションにエラーメッセージを追加します。

api/app/models/user.rb
validates :password, presence: true,
                     length: { minimum: 8 },
                     format: {
                       with: VALID_PASSWORD_REGEX,
                       message: :invalid_password 	# 追加
                     },
                     allow_blank: true

これで間違った書式の場合に明確なエラーメッセージを出力することができるようになりました。

["パスワードは半角英数字•ハイフン•アンダーバーが使えます"]

エラーメッセージに引数を渡す書き方

文字数制限のエラーを追加した場合、「何十文字以内で入力してください」とメッセージを出す方がユーザーにとって親切です。

このメ文字数制限のメッセージはja.yml内の140行目付近のto_longが使われます。

ja.yml
too_long: は%{count}文字以内で入力してください

Railsは、lengthバリデーションを使うと自動的にエラーメッセージを設定してくれます。

user.rb
validates :name, presence: true,
                 length: { maximum: 30, allow_blank: true }
["名前は30文字以内で入力してください"]

しかし、カスタムバリデーションを設定する場合は自分で文字数を渡す必要があります。

その際の書き方は以下のようになります。

user.errors.add(:name, :too_long, count: 30)
  • :too_long, count: 30 … エラーメッセージの後にja.ymlと一致するcountキーに値を持たすことでエラーメッセージに引数が渡せる。

これは次の記事「メールアドレスのカスタムバリデーション」で実際に使用します。お楽しみに。

Railsコンソールで確認してみよう

これまでの設定をコンソールに入って確認してみましょう。

root $ docker-compose run --rm api rails c

カラム名日本語化の確認

空のユーザーを保存してみます。

> user = User.new
> user.save
> user.errors.full_messages
=> ["パスワードを入力してください", "名前を入力してください"]

カラム名が正しく日本語化されていますね。

ちなみに正しく設定できているかを確認するには以下の命令を実行します。

> I18n.t("activerecord.attributes.user")
=> {:name=>"名前", :email=>"メールアドレス", :password=>"パスワード", :activated=>"アクティブフラグ", :admin=>"管理者フラグ"}
  • I18n.t("パス") … 引数のパスで指定したymlファイルの値を返す。

    このパスはインデントで区切られたキーを指定します。

パスワードエラーメッセージの確認

パスワードの書式エラーが正しく設定できているか確認してみましょう。

> user.password = "ああああああああ"
> user.save
> user.errors.full_messages
=> ["名前を入力してください", "パスワードは半角英数字•ハイフン•アンダーバーが使えます"]

正しく設定できていますね。

確認できたらコンソールから抜けておきましょう。

> exit

コミットしとく

今回の設定は以上となります。

ここまでの「api」ディレクトリの編集をコミットしておきましょう。

root $ cd api
api  $ git add -A
api  $ git commit -m "add_user_validation_and_ja.yml"
api  $ cd ..
root $ # ここに戻っておく

まとめ

今回は「I18n」モジュールが使用するja.ymlファイルを設定していきました。

今回のRailsアプリは「apiモード」なので、サーバーサイドから吐き出すメッセージを日本語化すればOKです。

フロントエンドの言語を切り替える場合にはNode.js用の「I18n」モジュールを使用します。

多言語化対応のWebアプリケーションを制作する場合は是非使ってみてください。

次回予告

メールアドレスのバリデーションがまだ設定できていませんね。

次回は、emailカラムのバリデーションをRailsのカスタムバリデーション機能を使って行います。

どうぞお楽しみに。(↓へGO)

あなたの力になれること
私自身が独学でプログラミングを勉強してきたので、一人で学び続ける苦しみは痛いほど分かります。そこで、当時の私がこんなのあったら良いのにな、と思っていたサービスを立ち上げました。周りに質問できる人がいない、答えの調べ方が分からない、ここを聞きたいだけなのにスクールは高額すぎる...。そんな方に向けた単発・短期間メンターサービスを行っています。下のサービスへお進みください。
独学プログラマのサービス
次の記事はこちら
1. このカテゴリーの歩き方 #01
【お知らせ】UdemyでRails × Nuxt.jsの動画を公開することになりました
1. このカテゴリーの歩き方 #02
【随時更新】このカテゴリーで作るアプリケーションの仕様書
1. このカテゴリーの歩き方 #03
【随時更新】このカテゴリーの歩き方
1. このカテゴリーの歩き方 #04
(Docker+Rails6+Nuxt.js+PostgreSQL)=>Heroku 環境構築~デプロイまでの手順書
2. Docker入門 #01
Docker for Macをインストールする手順
2. Docker入門 #02
分かるDocker解説。仮想環境・コンテナ・Dockerイメージ・Dockerfileとは何か?
2. Docker入門 #03
分かるDocker解説。DockerComposeとは何か?
3. Dockerを使ったRails+Nuxt.js環境構築 #01
【Docker+Rails6+Nuxt.js】今回作成するアプリの開発環境の全体像を知ろう
3. Dockerを使ったRails+Nuxt.js環境構築 #02
【MacOS】Homebrew経由でGitをインストールする方法
3. Dockerを使ったRails+Nuxt.js環境構築 #03
Rails6を動かすAlpineベースのDockerfileを作成する(AlpineLinuxとは何か)
3. Dockerを使ったRails+Nuxt.js環境構築 #04
Nuxt.jsを動かすAlpineベースのDockerfileを作成する(C.UTF-8とは何か)
3. Dockerを使ったRails+Nuxt.js環境構築 #05
.envファイルを使ったdocker-compose.ymlの環境変数設計
3. Dockerを使ったRails+Nuxt.js環境構築 #06
Rails6・Nuxt.js・PostgreSQLを動かすdocker-compose.ymlファイルを作成する
3. Dockerを使ったRails+Nuxt.js環境構築 #07
docker-compose.ymlを使ってRails6を構築する(PostgreSQLパスワード変更方法)
3. Dockerを使ったRails+Nuxt.js環境構築 #08
docker-compose.ymlを使ってNuxt.jsを構築する
4. 複数プロジェクトのGit管理 #01
複数プロジェクトで行うGit管理の全体像を理解しよう(Gitサブモジュール解説)
4. 複数プロジェクトのGit管理 #02
【Git】既存の子ディレクトリをサブモジュール管理に変更する手順
4. 複数プロジェクトのGit管理 #03
【GitHub】秘密鍵の生成・公開鍵を追加・SSH接続するまでを画像で分かりやすく
4. 複数プロジェクトのGit管理 #04
【GitHub】リモートリポジトリの追加・サブモジュールのリンク設定を行う
5. RailsAPI×Nuxt.js初めてのAPI通信 #01
【Rails6】"Hello" jsonを返すコントローラを作成する
5. RailsAPI×Nuxt.js初めてのAPI通信 #02
【Nxut.js】axiosの初期設定を行う(baseURL・browserBaseURLを解説)
5. RailsAPI×Nuxt.js初めてのAPI通信 #03
【Rails6】Gem rack-corsを導入してCORS設定を行う(オリジン・CORSとは何か)
6. Heroku.ymlを使ったDockerデプロイ #01
デプロイ準備。Herokuへ新規会員登録を行いHerokuCLIをインストールする
6. Heroku.ymlを使ったDockerデプロイ #02
heroku.yml解説編。Docker環境のRails6をHerokuにデプロイする(1/2)
6. Heroku.ymlを使ったDockerデプロイ #03
HerokuCLI-manifestのデプロイ解説編。Docker環境のRails6をHerokuにデプロイする(2/2)
6. Heroku.ymlを使ったDockerデプロイ #04
Dockerfile解説編。Docker環境のNuxt.jsをHerokuにデプロイする(1/2)
6. Heroku.ymlを使ったDockerデプロイ #05
デプロイ完結編。Docker環境のNuxt.jsをHerokuにデプロイする(2/2)
7. モデル開発事前準備 #01
【Rails6】application.rbの初期設定(タイムゾーン・I18n・Zeitwerk)
7. モデル開発事前準備 #02
【Rails6】モデル開発に必要なGemのインストールとHirb.enableの自動化
7. モデル開発事前準備 #03
【Docker+Rails】A server is already running. Check /tmp/pids/server.pidエラーの対応
7. モデル開発事前準備 #04
【Docker】<none>タグのイメージを一括削除する & Rails .gitignoreの編集
8. ユーザーモデル開発 #01
Railsユーザーモデル作成。テーブル設計・ユーザー認証設計を理解する
8. ユーザーモデル開発 #02
Railsユーザーモデルのバリデーション設定(has_secure_password解説)
8. ユーザーモデル開発 #03
Railsバリデーションエラーメッセージの日本語化(ja.yml設定方法)
8. ユーザーモデル開発 #04
EachValidatorクラスのカスタムバリデーション設定(Rails6/lib以下読込)
8. ユーザーモデル開発 #05
Rails環境ごとにSeedデータ切り替えるseeds.rbの書き方
8. ユーザーモデル開発 #06
Rails6から導入された並列テストを理解する
8. ユーザーモデル開発 #07
Railsユーザーモデルバリデーションテスティング(name/email/password)
8. ユーザーモデル開発 #08
Nuxt.jsからRailsのユーザーテーブルを取得しHerokuにデプロイする
9. Nuxt.jsフロント開発事前準備 #01
【Nuxt.js2.13超解説】バージョンアップ手順と6つの新機能+2つの変更点
9. Nuxt.jsフロント開発事前準備 #02
Docker AlpineベースのNode.js上で動くNuxt.jsにVuetifyを導入する
9. Nuxt.jsフロント開発事前準備 #03
VuetifyにカスタムCSSを導入してオリジナルブレイクポイントを作る
9. Nuxt.jsフロント開発事前準備 #04
Nuxt.jsにnuxt-i18nを導入して国際化に対応する
10. 認証アプリのレイアウト設計 #01
Nuxt.jsのレイアウト・ページ・コンポーネントの役割を理解しよう
10. 認証アプリのレイアウト設計 #02
ウェルカムページを構成するコンポーネントファイル群を作成しよう(1/4)
新着
10. 認証アプリのレイアウト設計 #03
ウェルカムページにアイキャッチ画像・アプリ名・メニューボタンを表示しよう(2/4)
新着
10. 認証アプリのレイアウト設計 #04
addEventListenerでスクロールを検知しツールバーの色を変化させよう(3/4)
新着
10. 認証アプリのレイアウト設計 #05
ウェルカムページをレスポンシブデザインに対応させよう(4/4)
新着
SPA開発
ブログ構築
小ネタ集