2010-04-30 11 views
20

Estoy usando el método to_json en un objeto, y estoy intentando que el argumento :methods funcione. Tengo un método en mi modelo (Drop) llamado is_favorited_by_user?. Este método toma un argumento del current_user, y luego verifica si el usuario usa la gota. ¿Cómo puedo pasar este argumento a través del método to_json?Ruby to_json: methods arguments

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

Respuesta

36

Puede añadir current_user atributo a su modelo y configurarlo antes de ejecutar 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

¡Eso funcionó! Gracias, Voyta! –

+4

¿Cómo extiendo esta solución cuando estoy haciendo render: json => Drop.all en la acción de índice. ¿Dónde asigno el usuario actual? –

+3

'cattr_accessor: current_user' en el modelo y luego' Model.current_user = current_user' en el controlador. –

4

Los métodos to_json toma no están destinados a ser los que toman argumentos, pero sólo métodos "getter". (Normalmente son las creadas en base a su atributos db.)

Ver ejemplos aquí, ninguno pasar argumentos:

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

Si usted quiere hacer algo personalizado, se tendrá que crear un método que construye el hash de información que desea, luego convierta ese hash a json.

+1

¿Hay una manera que puedo conseguir la variable current_user dentro de mi modelo, por lo que no es necesario pasar el argumento? –

+0

@JamesFinley Los modelos no son (y no deberían ser) conscientes del estado de los controladores o de la solicitud http. current_user es parte de la solicitud y no debe exponerse a los modelos de forma global debido al problema multiproceso indicado anteriormente. Debe pasar solo como un parámetro de método. – hammady