今回達成すること
バリデーションのエラーメッセージを日本語に対応するための設定を行います。
具体的には、「I18n(アイエイティーンエヌ)」モジュールが読み込む
I18nとはRailsアプリを多言語化対応するためのモジュールで、同一コードでもユーザーに表示する言語を切り替ることができます。
ja.ymlファイルを作成する
この回で
config.i18n.default_locale = :ja
この設定をするとI18nは下記のファイルを読み込みます。
/config/locales/ja.yml
最初にI18n読み込みファイル
root $ touch api/config/locales/ja.yml
確認しておきましょう。
root $ ls -1 api/config/locales
en.yml
ja.yml
ja.ymlに日本語化対応を記述する
この設定を一から自分でやるのは大変ですので、Rails用の日本語化ファイルを作成している猛者の力を借ります。(感謝)
下記URLのファイル内容をコピーして
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: 管理者フラグ
# ここまで
オリジナルエラーメッセージの追加
パスワードバリデーションのエラーメッセージを追加します。
ユーザーパスワードはこちらで書式を制限していますが、どの値が使えるのかユーザーには不明確です。
初期エラーメッセージの「不正な値です」だけではユーザーに次の行動を促せないため、「何が使えるのか」を具体的にメッセージ化します。
まずはmessages:
(117行目付近)の下に2インデントをつけてエラーメッセージを追加します。
api/config/locales/ja.yml
...
messages:
invalid_password: は半角英数字•ハイフン•アンダーバーが使えます # 追加
accepted: を受諾してください
続いて
api/app/models/user.rb
validates :password, presence: true,
length: { minimum: 8 },
format: {
with: VALID_PASSWORD_REGEX,
message: :invalid_password # 追加
},
allow_blank: true
これで間違った書式の場合に明確なエラーメッセージを出力することができるようになりました。
["パスワードは半角英数字•ハイフン•アンダーバーが使えます"]
エラーメッセージに引数を渡す書き方
文字数制限のエラーを追加した場合、「何十文字以内で入力してください」とメッセージを出す方がユーザーにとって親切です。
このメ文字数制限のメッセージは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」モジュールが使用する
今回のRailsアプリは「apiモード」なので、サーバーサイドから吐き出すメッセージを日本語化すればOKです。
フロントエンドの言語を切り替える場合にはNode.js用の「I18n」モジュールを使用します。
多言語化対応のWebアプリケーションを制作する場合は是非使ってみてください。
次回予告
メールアドレスのバリデーションがまだ設定できていませんね。
次回は、email
カラムのバリデーションをRailsのカスタムバリデーション機能を使って行います。
どうぞお楽しみに。(↓へGO)