2017-02-06 1 views
0

ich auf Schienen zu lernen Rubin beginnen, und ich mag vorübergehend ein Attribut zu einem Modell hinzufügen, so habe ich das Accessor zu meinem Modell:hinzufügen temporäres Attribut auf ein Modell

attr_accessor :dettes 

Und dann habe ich die Methode each hier ist das, was ich habe:

@depenses = Depense.where(user_id: @user.id) 
@depenses.each do |d| 
    d.dettes = "value" 
end 
render json: @depenses 

aber das funktioniert nicht, mein neues Attribut nicht

hinzugefügt wird

ich habe andere Fragen zu diesem Thema gesehen, aber ich bin immer noch nicht in der Lage, dies zu lösen bin ich Ich vermisse etwas?

Antwort

0

Standardmäßig fügt render :json nur die permanenten Attribute hinzu. Sie können die temporären als auch auf diese Weise hinzufügen:

render json: @depenses, methods: :dettes 
+0

Oh ok ich sehe danke! Ist das das gleiche wie '@ depends.to_json (: methods => [: dettes])'? –

+0

Ja, dasselbe! Render: json ruft .to_json auf, welches Objekt auch immer gerendert wird. Und: Methoden nehmen ein Array von Elementen an, aber wenn Sie nur ein Element haben, können Sie es ohne die Klammern übergeben. – eiko

0

Soweit ich verstehe Sie Objekt innerhalb Anfrage ändern wollen, ohne sie in der Datenbank mutiert, so dass Sie attr_accessor hinzufügen. Dann verwendet man

@depenses = Depense.where(user_id: @user.id) 

Welche Instanz von Active zurück :: Relation (nicht explizit Instanzen von Objekten, die Sie ändern können). Wenn Sie also innerhalb dieser Beziehungsinstanz iterieren und sie attr_accessor ändern, wurde die Instanz von modyfied object keiner öffentlichen Variablen zugewiesen. Grundsätzlich müssen Sie Bezug auf Array konvertieren, dann @depenses gehen eine Reihe von dépense Instanz Objekte sein, die Sie ändern können, und übergeben Sie Methoden machen:

@depenses = Depense.where(user_id: @user.id).to_a 

Dann brauchen Sie json sagen, dass Sie benutzerdefinierte verwenden Verfahren für die Serialisierung, wie @eiko erwähnt:

render json: @depenses, methods: :dettes 

(Aber wenn Sie eine Beute von Daten in dépense Datentabelle haben, dann ist es nicht die beste Idee, verwenden Sie Gonna einige Einschränkungen mit Offsets für where-Klausel)

Schaukeln;)

Verwandte Themen