2016-06-24 16 views
0

Ich bin vorbei verschachtelte JSON in Schienen wie so:Rails 4 - Iterate durch verschachtelte JSON params

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

, um die Kategorie zu einem Produkt zu aktualisieren. Ich versuche, die Kategorien in meinem products_controller Attribut zu durchlaufen, so dass ich hinzufügen/entfernen, um ein Produkt zu mehreren Kategorien auf einmal:

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 

Dies ist jedoch nur die zweiten ‚Kategorien‘ ID in dem Update verwendet und doesn wiederhole nicht beide. Beispiel Antwort JSON:

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

Wie Sie sehen können, hat es nur die Kategorie mit ID = 4 und übersprungen Kategorie 3.

ich ziemlich neu bin auf Schienen, damit ich weiß, ich bin Vermutlich fehlt hier etwas offensichtlich. Ich habe mit dem Format des JSON herumgespielt, das ich auch passiere, aber es hat alles nur noch schlimmer gemacht.

Antwort

0

Sie müssen Ihre JSON-Struktur ändern. Wie Sie es derzeit haben, überschreibt die zweite "Kategorien" -Referenz die erste, da Sie nur eine Instanz eines Schlüssels haben können. Zu bekommen, was Sie wollen, sollten Sie es ändern:

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

Sie auch ändern müssen Ihre Ruby-Code aussehen:

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

, die Sinn macht. Wenn ich dies jedoch ändere, bekomme ich eine Fehlermeldung "> keine implizite Umwandlung von Symbol in Integer" in dieser Zeile: "@category = Category.find_by (id: params [: product] [: categories] [: id]) " – Seanvm

+0

@Seanvm Ich habe meiner Antwort ein bisschen mehr hinzugefügt. Sehen Sie, ob das hilft. – rdubya

+0

Das hat funktioniert! Vielen Dank! – Seanvm

Verwandte Themen