J'ai une application Ruby on Rails que je travaille sur une API pour une application iPhone associée.La méthode to_json personnalisée n'est pas appelée dans l'application Rails
J'ai remplacé la méthode to_json
de mon modèle Item pour renvoyer des informations personnalisées de la demande d'API dont j'ai besoin dans l'application iPhone. Toutefois, lorsque j'utilise la méthode intégrée to_json rails et que j'inclue mon modèle Item en tant que paramètre associé, ma méthode Item#to_json
n'est pas appelée et la valeur par défaut to_json de l'objet AR est appelée.
Voir le code suivant (@api_user is a User model object
)
render :json => @api_user.to_json(:include => { :friends => { :include => :items, :except => :api_token } })
Je compris l'association friends
qui est à son tour, y compris la items
assocation, mais la valeur par défaut sur le point to_json
est appelé, pas mon to_json personnalisé.
Qu'est-ce qui me manque?
Voici ma méthode Item#to_json
def to_json(options={})
{
:id => self.id,
:name => name,
:description => description,
:url => url,
:quantity => quantity,
:price_range_raw => price_range,
:price_range => human_readable_price_range(price_range),
:can_be_purchased => can_be_purchased?,
:completely_purchased => completely_purchased?,
:remaining_qty => remaining_quantity,
:thumb_photo_url => photo.url(:thumb),
:small_photo_url => photo.url(:small),
:large_photo_url => photo.url(:large),
:priority_raw => priority,
:priority => human_readable_priority(priority)
}.to_json
fin
Aucun autre modèle ont la méthode #to_json
overriden
Pouvez-vous montrer votre méthode 'to_json'? Ma supposition initiale est soit la méthode 'to_json' pour' User' ne récursive pas l'élément 'Item', soit votre méthode' to_json' prend des arguments différents et une sorte de méthode magique 'method_missing' est appelée à la place. – Karl
sûr, je l'ai ajouté ci-dessus – cpjolicoeur
Je creuse dans la source et ma conjecture est que l'encodeur JSON ActiveSupport pour enumerables ne appelle pas to_json sur chaque élément, mais plutôt sérialiser l'ensemble du tableau en un seul. Je devrais probablement écrire ma propre fonction de mappage pour passer les données comme je le souhaite. – cpjolicoeur