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