2010-04-30 17 views
20

Sto usando il metodo to_json su un oggetto e sto cercando di far funzionare l'argomento :methods. Ho un metodo sul mio modello (Drop) chiamato is_favorited_by_user?. Questo metodo accetta un argomento di current_user, quindi verifica se il rilascio è preferito dall'utente. Come posso passare questo argomento attraverso il metodo to_json.Ruby to_json: metodi argomenti

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

risposta

36

È possibile aggiungere l'attributo current_user al modello e impostarlo prima di eseguire 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

Ha funzionato! Grazie, Voyta! –

+4

Come estendere questa soluzione quando eseguo render: json => Drop.all nell'azione index. Dove assegno l'utente corrente? –

+3

'cattr_accessor: current_user' nel modello e quindi' Model.current_user = current_user' nel controller. –

4

I metodi to_json prende non sono destinati ad essere quelli che accettano argomenti, ma solo metodi "getter". (Tipicamente quelle create in base alla caratteristiche db.)

si vedano gli esempi qui, nessuno Argomenti Pass:

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

Se si vuole fare qualcosa di personalizzato, è necessario creare un metodo che crea l'hash delle informazioni che desideri, quindi converti l'hash in json.

+1

C'è un modo che io possa avere la variabile current_user nel mio modello, quindi non c'è bisogno di passare l'argomento? –

+0

@JamesFinley I modelli non sono (e non dovrebbero essere) a conoscenza dello stato dei controller o della richiesta HTTP. current_user è parte della richiesta e non deve essere esposto ai modelli in modo globale a causa del problema con multithreading indicato sopra. Dovrebbe essere passato solo come parametro del metodo. – hammady

Problemi correlati