Railsで日本語でenumを使うところまでのメモ。
まずは基本的な設定から
config\initializersにlocale.rbを作成し、以下を記述。
Rails.application.config.i18n.default_locale = :ja
下記URLから日本語化用のja.ymlをダウンロードし、config\localesに置く。
https://github.com/svenfuchs/rails-i18n/blob/master/rails/locale/ja.yml
deviseを使う場合はこちらもダウンロードして、config\localesに置いておくと便利。
http://qiita.com/MasatoYoshioka@github/items/8d910e793e7c485403bb
これで基本的なフォームのラベルやエラーメッセージは日本語に対応することができる。
ja.ymlの編集
日本語に対応する部分を編集する。
---
ja:
activerecord:
errors:
messages:
record_invalid: 'バリデーションに失敗しました: %{errors}'
restrict_dependent_destroy:
has_one: "%{record}が存在しているので削除できません"
has_many: "%{record}が存在しているので削除できません"
attributes:
user:
name: 名前
email: メールアドレス
birth_date: 年齢
sex: 性別
school: 学校名
admin: 管理者権限
password: パスワード
password_confirmation: パスワード(確認)
created_at: 登録日時
updated_at: 更新日時
remember_me: ログインを記憶する
attributeの後に日本語に対応した部分を記述する。ここではUserモデルに対して追加した。
こうすることで以下のように使える。(コンソールで実行)
irb(main):001:0> User.human_attribute_name(:name)
=> "名前"
irb(main):002:0> User.human_attribute_name(:email)
=> "メールアドレス"
こんな使い方もできる。
irb(main):003:0> Time.now.to_s(:ja)
=> "2019年03月22日 19時13分"
enumの日本語化対応
まずenumの設定
今回は性別をenumで管理する場合を考える。
以下のマイグレーションを実行。
class AddColumnUsers < ActiveRecord::Migration[5.1]
def change
add_column :users, :sex, :integer
end
end
性別をenumで管理するための設定を追加する。
class User < ApplicationRecord
enum sex: { woman: 0, man: 1 }
end
enumを簡単に日本語化できるgemがあるのでGemfileに以下を追加してbundle。
gem 'enum_help'
これで以下のように日本語でenumから値を取り出せる。
irb(main):004:0> User.last.sex_i18n
User Load (1.0ms) SELECT "users".* FROM "users" ORDER BY "users"."id" DESC LIMIT $1 [["LIMIT", 1]]
=> "女性"
enumで扱う値はselectboxを使うことが多いため、formでは以下のようにmapを使うと簡単に実装できる。(sexesのように複数形になることに注意)
= f.select :sex, User.sexes_i18n.keys.map {|k| [User.sexes_i18n[k], k]}, {}, autofocus: true
= f.label :school
最後に
多言語化対応しない場合でも、ラベルも日本語で直接書くよりも常にhuman_attribute_name等を使った方が後々ja.ymlだけを編集すればよくなるので楽かも。