Rails3でのvalidationメモ
特定の親の下でユニークな名前にしたい場合
validatesのuniquenessに:scopeを入れる。
class Parent < ActiveRecord::Base has_many :children end class Children < ActiveRecord::Base belongs_to :parent validates :name, :uniquness => {:scope => :parent_id} end
さらに、エラーメッセージも変えたい場合
:uniquenessのoptionとして:messagesを入れる。
日本語を入れる場合はmagic commentが必要なのに注意。
# -*- coding:utf-8 -*- class Children < ActiveRecord::Base belongs_to :parent validates :name, :uniqueness => {:scope => :parent_id, :message => "同一の親のもとですでに存在しています。"} end
さらに、I18nにしたい場合
ja.ymlにメッセージを追加しておく。(もちろん、en.ymlでも良い)
activerecord: errors: messages: taken: "はすでに存在します。" taken_on_scope: "は%{model}にすでに存在します。" #ここ! record_invalid: "バリデーションに失敗しました。 %{errors}" <<: *errors_messages
I18n.tでメッセージ変換して出す。
# -*- coding:utf-8 -*- class Children < ActiveRecord::Base belongs_to :parent validates :name, :uniqueness => {:scope => :parent_id, :message => I18n.t('activerecord.errors.messages.taken_on_scope', :model => Genre.model_name.human)} end