2016-06-24 104 views
0

我传递嵌套的JSON进入轨道,像这样:轨道4 - 遍历嵌套的JSON PARAMS

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

,以更新产品的类别。我想遍历类别在我products_controller属性,这样我可以添加/删除产品的多个类别一次:

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类

我是相当新的轨道,所以我知道我可能在这里丢失了明显的东西我玩过我传入的JSON格式,但这只会让事情变得更糟。

回答

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 
+0

这是有道理的。如果我改变它,但是在这一行我得到一个错误:“没有将符号隐式转换为整数”:“@category = Category.find_by(id:params [:product] [:categories] [:id] )“ – Seanvm

+0

@Seanvm我给我的答案增加了一些。看看是否有帮助。 – rdubya

+0

工作!谢谢! – Seanvm