2010-04-30 9 views
20

Ich verwende die to_json Methode für ein Objekt, und versuchen, das :methods Argument zu arbeiten. Ich habe eine Methode auf meinem Modell (Drop) is_favorited_by_user? genannt. Diese Methode verwendet ein Argument der current_user und überprüft dann, ob der Tropfen vom Benutzer bevorzugt wird. Wie kann ich dieses Argument durch die to_json Methode übergeben.Ruby to_json: Methoden Argumente

render :json => @drops.to_json(:methods => :is_favorited_by_user?(current_user)) 

Antwort

36

Sie können current_user Attribut zu Ihrem Modell hinzufügen und festlegen, bevor to_json

attr_accessor :current_user 

    def is_favorited_by_user?(user=nil) 
    user ||= current_user 
    # rest of your code 
    end 


@drops.current_user = current_user 
render :json => @drops.to_json(:methods => :is_favorited_by_user?) 
+0

Das hat funktioniert! Danke, Voyta! –

+4

Wie erweitere ich diese Lösung, wenn ich render mache: json => Drop.all in der Indexaktion. Wo ordne ich den current_user zu? –

+3

'cattr_accessor: current_user' im Modell und dann' Model.current_user = current_user' im Controller. –

4

Die Methoden to_json nimmt nicht als diejenigen gedacht, die Argumente, sondern „Getter“ Methoden nur. (In der Regel erstellt die, die auf der Grundlage Ihrer db Attribute.)

Siehe Beispiele hier, kein Pass Argumente:

http://apidock.com/rails/ActiveRecord/Serialization/to_json

Wenn Sie etwas benutzerdefinierte tun mögen, müssen Sie eine Methode erstellen, erstellt den Hash der gewünschten Informationen und konvertiert diesen Hash in json.

+1

Ausführung Gibt es eine Möglichkeit, dass ich den current_user Variable in meinem Modell zu bekommen, so brauche ich nicht, das Argument zu übergeben? –

+0

@JamesFinley Modelle sind nicht (und sollten nicht) den Status von Controllern oder HTTP-Anfragen kennen. current_user ist Teil der Anfrage und sollte aufgrund des oben genannten Multithread-Problems nicht global für Modelle verfügbar gemacht werden. Es sollte nur als Methodenparameter übergeben werden. – hammady