5

Ich habe Probleme beim Aktualisieren einer Rails JSON-Spalte in einem Modell.Postgres JSON-Spalte Aktualisieren einzelner Schlüssel/Attribute mit Formular

Ich habe ein OrderItem-Modell mit einer: Optionen-Spalte mit dem postgres json-Datentyp.

Ich habe ein Formular, wo ich nur versuche, zwei Attribute in dieser JSON-Spalte zu aktualisieren. Wenn ich jedoch die Aktualisierungsaktion von meinem Controller aus führe, wird die gesamte Optionsspalte nur auf die Felder in meinem Formular zurückgesetzt, anstatt nur die zwei einzelnen Attribute zu aktualisieren. Ist das ein Fehler? Ich bin auf Rails 4.2.1 und von was ich gelesen habe, sollte dies funktionieren, und ich kann einzelne Attribute in der Rails-Konsole manuell aktualisieren.

In meinem Controller:

def update 
    @order_item.update(order_item_params) 
    respond_with(:update) 
end 

private 

    def order_item_params 
     params.require(:order_item).permit(:product_id, :quantity, options:[:esp, :size]) 
    end 

Meine Form:

<%= f.fields_for :options do |option| %> 
     <%= option.label :size %> 
     <%= option.select :size, options_for_select((5..13), item.options["size"]) %> 
     <%= option.select :esp, options_for_select(["yes","no"], item.options["esp"]) %> 
    <% end %> 

Wenn das Formular nicht die einzelnen Attribute aktualisieren nicht vorgelegt. Es setzt die gesamte json Spalte nur auf diese beiden Attribute

Form Data 
utf8:✓ 
_method:patch 
order_item[quantity]:2 
order_item[options][size]:5 
order_item[options][esp]:no 

In Konsole ich manuell leicht Attribute aktualisieren kann ...

o = OrderItem.last 
o.options["esp"] = "yes" 
o.save 

#PERSISTS! 
+0

waren Sie jemals in der Lage, eine Lösung für diese zu finden? –

Antwort

0

ich nicht Ihre vollständige Bewerbung haben, aber ich nehme an, dass, wenn Sie geben nur diese 2 Parameter ein - es führt nicht die gleichen Aktionen aus, die Sie in der Konsole ausführen. Wenn das Formular gesendet wird, wird erwartet, dass alle Ihre Parameter akzeptiert werden und nicht nur diejenigen, die Sie dem Formular hinzugefügt haben.

Um dies zu verhindern - Sie können alle Ihre anderen Felder als ausgeblendet hinzufügen, und auf diese Weise die Daten zu bewahren.

0

Sie können manuell angeben, wie Sie Ihre Optionen json getrennt vom Rest des Objekts aktualisieren.

Eine Strategie könnte sein, Optionen aus den zulässigen order_item_params entfernen dann so etwas tun:

def update 
    @order_item.options.merge!(params[:order_item][:options] 
    @order_item.update(order_item_params) 
    respond_with(:update) 
end 
Verwandte Themen