2010-04-30 5 views
20

J'utilise la méthode to_json sur un objet, et essaye de faire fonctionner l'argument :methods. J'ai une méthode sur mon modèle (Drop) appelée is_favorited_by_user?. Cette méthode prend un argument du current_user, puis vérifie si la suppression est favorisée par l'utilisateur. Comment puis-je passer cet argument à travers la méthode to_json.Ruby to_json: arguments méthodes

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

Répondre

36

Vous pouvez ajouter current_user attribut à votre modèle et définir avant d'exécuter 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

Cela a fonctionné! Merci, Voyta! –

+4

Comment puis-je étendre cette solution lorsque je fais le rendu: json => Drop.all dans l'action d'index. Où dois-je attribuer l'utilisateur actuel? –

+3

'cattr_accessor: current_user' dans le modèle, puis' Model.current_user = current_user' dans le contrôleur. –

4

Les méthodes ne sont pas to_json Takes destinées à être ceux qui prennent des arguments, mais seulement des méthodes « getter ». (En général celles qui sont créées en fonction de vos attributs db.)

Voir exemples ici, aucun des arguments de passe:

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

Si vous voulez faire la coutume quelque chose, vous aurez besoin de créer une méthode construit le hachage d'info que vous voulez, puis convertit ce hachage en json.

+1

Est-il possible que je peux obtenir la variable current_user dans mon modèle, donc je ne pas besoin de passer l'argument? –

+0

@JamesFinley Les modèles ne sont pas (et ne devraient pas être) au courant de l'état des contrôleurs ou de la requête http. current_user fait partie de la demande et ne devrait pas être exposé aux modèles de façon globale en raison du problème multithread mentionné ci-dessus. Il devrait être passé seulement en tant que paramètre de méthode. – hammady