秘密はあなたがエラーを置くところにあります。自動保存の関連付けによる検証が手がかりとしてどのように機能するかを確認してください。
def association_valid?(reflection, record)
return true if record.destroyed? || record.marked_for_destruction?
unless valid = record.valid?(validation_context)
if reflection.options[:autosave]
record.errors.each do |attribute, message|
attribute = "#{reflection.name}.#{attribute}"
errors[attribute] << message
errors[attribute].uniq!
end
else
errors.add(reflection.name)
end
end
valid
end
エラーがアソシエーションメンバーに追加されるのではなく、検証されるレコードに追加されることに注意してください。問題のある属性の前にアソシエーション名が付けられます。これもできるはずです。次のようなものを試してください:
def matching_card_colors
color = nil
cards.each do |card|
if color.nil?
color = card.color
elsif card.color != color
# Note, there's one error for the association. You could always get fancier by
# making a note of the incorrect colors and adding the error afterwards, if you like.
# This just mirrors how autosave_associations does it.
errors['cards.color'] << "your colors don't match!"
errors['cards.color'].uniq!
end
end
end