2

has_many在某些模型中有关系,并接受它的嵌套属性。在未通过此关系的验证后,属于某个属性的所有错误都存储在错误哈希的同一键中。

部分请求:

"values_attributes":[{"value":"","attribute_id":1,"id":1,"auction_id":1},{"value":"6.6","attribute_id":3,"id":7,"auction_id":1}]

回复:

"values.value":["can't be blank","must be an integer"]

这里,can't be blankerror 属于第一个属性,属于must be an integer第二个。所以我需要在控制器中写这样的东西:

errors = @auction.errors.to_hash
errors['values'] = Hash[@auction.values.reject{ |v| v.valid? }.collect{ |v| [v.attribute_id, v.errors.to_hash]}]

了解错误属于哪个模型。

是否存在更干净的方法来做到这一点?

4

1 回答 1

1

如果您需要访问子记录中的确切错误,则不得通过父错误集合进行访问。子记录本身有一个错误收集,您可以在其中获得详细的访问权限。父级上的聚合错误仅说明该记录无法保存,因为存在无效的子记录。

如果您需要所有错误,则需要自己汇总它们。(就像你对你的collect电话所做的那样)。如果多次使用此代码,请考虑将其移入方法中Auction

class Auction
  def aggregated_errors
    errors = self.errors.to_hash
    errors['values'] = Hash[values.reject{ |v| v.valid? }.collect{ |v| [v.attribute_id, v.errors.to_hash]}]
    errors
  end
end

如果您需要聚合不同模型和关联的错误,您可以进一步抽象collect调用以跨模型重用它。

于 2012-12-31T14:56:34.710 回答