Rails 4 - 迭代嵌套的JSON参数

时间:2016-06-24 01:18:24

标签: ruby-on-rails ruby json

我将嵌套的JSON传递到rails中,如下所示:

{
  "product": {
    "vendor": "Acme",
    "categories": 
        {
            "id": "3",
            "method": "remove",
        },
    "categories": 
        {
            "id": "4"
        }
  }
}

以更新产品类别。我试图遍历products_controller中的categories属性,以便我可以一次添加/删除产品到多个类别:

def updateCategory
    @product = Product.find(params[:id])

    params[:product][:categories].each do |u|
      @category = Category.find_by(id: params[:product][:categories][:id])
        if params[:product][:categories][:method] == "remove"
          @product.remove_from_category(@category)
        else
          @product.add_to_category(@category)
        end
      end
  end

但是,这仅使用第二个类别'更新中的ID并不会迭代这两者。 响应示例JSON:

 {
  "product": {
    "id": 20,
    "title": "Heavy Duty Aluminum Chair",
    "product_price": "47.47",
    "vendor": "Acme",
    "categories": [
      {
        "id": 4,
        "title": "Category 4"
     }
   ]
 }
}

如您所见,它只添加了ID = 4的类别,并跳过了第3类。

我对rails非常陌生,所以我知道我可能在这里遗漏了一些明显的东西。我已经玩过JSON的格式我也传入了,但它只会让事情变得更糟。

1 个答案:

答案 0 :(得分:0)

您需要更改JSON结构。正如您目前所拥有的那样,第二个“类别”引用将覆盖第一个“类别”引用,因为您只能拥有一个键的实例。要获得您想要的,您应该将其更改为:

{
  "product": {
    "vendor": "Acme",
    "categories": [
        {
            "id": "3",
            "method": "remove",
        }, 
        {
            "id": "4"
        }
    ]
  }
}

您还需要将ruby代码更改为:

def updateCategory
    @product = Product.find(params[:id])

    params[:product][:categories].each do |u|
      @category = Category.find_by(id: u[:id])
      if u[:method] == "remove"
        @product.remove_from_category(@category)
      else
        @product.add_to_category(@category)
      end
    end
end