Ruby on Railsでは、カスタムバリデーションを使って独自のバリデーションを追加することができます。
しかし既存のバリデーションと違い、カスタムバリデーションではi18nによる翻訳を自分で追加しなければなりません。
このエントリではRuby on Rails 5において、カスタムバリデーションのエラーメッセージerrors.full_messages
の翻訳を追加する方法を説明します。
通常、モデルのバリデーションは次のようにロケールファイルを定義しておくことでerrors.full_messages
が翻訳された状態で得られます。
ja:
errors:
messages:
blank: を入力してください
taken: はすでに存在します
full_messages:
format: "%{attribute}%{message}"
attributes:
email: メールアドレス
例えばuser.email
フィールドがpresence: true
でエラーになった場合は、blank
にあたる「メールアドレス を入力してください」というエラーメッセージになります。
uniqueness: true
の場合はtaken
です。
他のバリデーションと翻訳の対応は下記から探してください。
Ruby on Rails 5で独自のカスタムバリデーションを追加するためには、ActiveModel::Validator
またはActiveModel::EachValidator
を継承したValidatorクラスを実装します。
Ruby on Railsガイドには次のような例が載っています。
class MyValidator < ActiveModel::Validator
def validate(record)
unless record.name.starts_with? 'X'
record.errors[:name] << '名前はXで始まる必要があります'
end
end
end
class Person
include ActiveModel::Validations
validates_with MyValidator
end
class EmailValidator < ActiveModel::EachValidator
def validate_each(record, attribute, value)
unless value =~ /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i
record.errors[attribute] << (options[:message] || "はメールアドレスではありません")
end
end
end
class Person < ApplicationRecord
validates :email, presence: true, email: true
end
どちらもrecord.errors
にエラーメッセージそのものを追加しています。
この方法では当然、i18nで翻訳することはできません。
errors.full_messages
を翻訳された状態で得るにはadd
メソッドを使って次のようにします。
class EmailValidator < ActiveModel::EachValidator
def validate_each(record, attribute, value)
unless value =~ /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i
record.errors.add(attribute, :not_email_format)
end
end
end
add
メソッドの第1引数はオブジェクトの属性です。
ActiveModel::Validator
を継承しているなら対象の属性名のシンボル(:email
や:name
)としてください。
第2引数の:not_email_format
に対応する翻訳をロケールのerrors
に追加します。
ja:
errors:
messages:
blank: を入力してください
taken: はすでに存在します
not_email_format: がメールアドレスの形式ではありません
このようにしておくことでEmailValidator
に引っかかったとき、errors.full_messages
が翻訳された状態で得られます。
この例ですと「メールアドレス がメールアドレスの形式ではありません」となります。
以上です。
このエントリではRuby on Rails 5において、カスタムバリデーションのエラーメッセージerrors.full_messages
の翻訳を追加する方法を説明しました。
コメントを送る
コメントはブログオーナーのみ閲覧できます