2 Stimmen

Rails kann keine geschützten Attribute für id, created_at massenhaft zuweisen

Ich verwende Rails als die Server-Seite einer Backbone.js-Website, daher bin ich ständig übergeben die Rails-Objekte hin und her.

Ich bemerke Fehler bei der Rückkehr von Rails WARNING: Can't mass-assign protected attributes: id, created_at, updated_at .

Ich finde das natürlich seltsam, weil ich diese Felder noch nie angeben musste Mein json sieht ziemlich normal aus, soweit ich das beurteilen kann

 Parameters: {"id"=>1, "updated\_at"=>"2011-04-21T16:41:02Z"},  "created\_at"=>"2012-02-23T21:01:02Z", "action"=>"test update"}

7voto

salt.racer Punkte 21113

Mit Ihrem JSON ist alles in Ordnung. Das Problem ist eine Frage der Sicherheit. Rails schützt bestimmte Attribute standardmäßig davor, dass sie von einem riesigen Hash erstellt oder aktualisiert werden. Das ist es, worauf sich der Fehler bezieht, wenn er den Begriff "Massenzuweisung" verwendet.

Das von Ihnen gepostete JSON:

Parameters: {"id"=>1, "updated_at"=>"2011-04-21T16:41:02Z"}, "created_at"=>"2012-02-23T21:01:02Z", "action"=>"test update"}

enthält die id die created_at und die updated_at Felder. Wenn dieses JSON an die Aktion übergeben wird und der Hash in einer model_object.update_attributes(hash_fields) erhalten Sie diese Fehlermeldung. Um diesen Fehler zu vermeiden, können Sie die Felder aus dem Hash löschen und sie später zuweisen, oder idealerweise ActiveRecord für sich arbeiten lassen und sie einfach ignorieren.

Wenn Sie sie wirklich zuordnen müssen, können Sie das auf diese Weise tun:

 model_object.id = id_variable
 model_object.created_at = created_at_variable
 model_object.updated_at = updated_at_variable
 model_object.save

EDIT1 (um auf die Bemerkung zur Rückgabe der ID einzugehen):

Wenn Sie das Rails-REST-Modell verwenden und die URL controller/:id/action aufrufen, müssen Sie die ID nicht zurückgeben, da diese Information bereits in der URL enthalten ist. Auf sie kann zugegriffen werden über params[:id] und der Hash über params[:model_name] (in Anlehnung an das Rails-Modell).

Wenn Sie etwas anderes tun und die ID muss in dem zurückgegebenen JSON sein, dann können Sie einfach id = params[:model_name][:id].delete und das löscht die ID aus dem Hash und gibt den Wert in einem Aufruf zurück. Es ist nicht ideal, aber es kann die Arbeit in einer Prise zu erledigen.

4voto

Syed Aslam Punkte 8537

Diese Spalten sind standardmäßig für die Massenzuweisung geschützt und können nicht manuell eingestellt werden. Sie können dieses Verhalten jedoch außer Kraft setzen, indem Sie eine Methode definieren:

def self.attributes_protected_by_default
  [] # ["created_at", "updated_at" ..other]
end

So können Sie Folgendes zuweisen created_at y updated_at manuell.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X