【问题标题】:Rails errors - Define Position or Object in which the error occuredRails 错误 - 定义发生错误的位置或对象
【发布时间】:2015-11-11 10:46:38
【问题描述】:

我有两个模型。例如PersonAddress

因为我想在一个请求中为人员添加或更新地址,所以人员模型如下所示:

has_many :addresses
accepts_nested_attributes_for :addresses

在地址控制器中只有一个验证

validates :city, presence: true

当我现在通过 json api 更新用户时,它就像一个魅力:

{
   "user": {
     "addresses_attributes": [
       {"street": "bla", "zip": "12345", "city": "blubb"},
       {"street": "blu", "zip": "98765", "city": "blebb"}
    ]
  }
}

现在我删除第二条记录的城市:

{
   "user": {
     "addresses_attributes": [
       {"street": "bla", "zip": "12345", "city": "blubb"},
       {"street": "blu", "zip": "98765"}
    ]
  }
}

在用户控制器中,我可以呈现一个 json 响应,例如:

render json: @user.errors

这给了我正确的错误。

我错过了,我不知道哪个地址引发了错误(在此示例中为第二个)。

有什么想法吗?

【问题讨论】:

    标签: ruby-on-rails json validation ruby-on-rails-4


    【解决方案1】:

    您可以返回带有嵌套属性和错误的整个用户对象。即

    render json: @user.as_json(
        include: [{addresses: {methods: [:errors]}], 
        methods: [:errors]
    )
    

    结果应该是这样的:

    {
       "user": {
         "errors": {...},
         "addresses_attributes": [
           {"street": "bla", "zip": "12345", "city": "blubb", "errors": {...}},
           {"street": "blu", "zip": "98765", "errors": {...}}
        ]
      }
    }
    

    【讨论】:

      【解决方案2】:

      您尝试创建的@user 仍将包含它尝试使用嵌套属性创建的地址。

      我不确切知道您希望如何呈现地址未通过验证的事实,但您可以通过迭代 @user.addresses 来识别确实失败的地址。

      例如,这将返回所有无效地址:

      @user.addresses.select { |address| !address.valid? }
      

      您仍然可以渲染这些对象或它们的 json 表示形式,即使它们尚未保存到数据库中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-28
        • 2020-02-03
        • 2011-12-19
        • 1970-01-01
        • 2016-01-14
        • 1970-01-01
        • 2013-05-04
        相关资源
        最近更新 更多