4

Rails 3のネストされた属性に手動でエラーを設定するにはどうすればよいですか?

以下は、私が試したが機能していないモデルコードの例です。

validate :matching_card_colors

has_many :cards
accepts_nested_attributes_for :card

def matching_card_colors
  color = nil
  cards.each do |card|
    if color.nil?
      color = card.color
    elsif card.color != color
      card.errors.add :color, "does not match other card colors"
    end
  end
end
4

1 に答える 1

11

秘密はあなたがエラーを置くところにあります。自動保存の関連付けによる検証が手がかりとしてどのように機能するかを確認してください。

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
于 2012-11-04T23:23:39.737 に答える