【问题标题】:Rails relational models errorsRails 关系模型错误
【发布时间】:2012-12-17 09:25:13
【问题描述】:

我在某些模型中有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 blank 错误属于第一个属性,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]}]

了解错误属于哪个模型。

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

【问题讨论】:

    标签: ruby-on-rails activerecord


    【解决方案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 调用以跨模型重用它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-10
      • 2015-12-15
      相关资源
      最近更新 更多