2010-07-08 6 views
1

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

+0

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

+0

sûr, je l'ai ajouté ci-dessus – cpjolicoeur

+2

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

Répondre

1

Utilisez-méditez? Si c'est le cas, ils écrasent la méthode to_json et to_xml (merci, les gars).

De la source Devise:

%w(to_xml to_json).each do |method| 
    class_eval <<-RUBY, __FILE__, __LINE__ 
     def #{method}(options={}) 
     if self.class.respond_to?(:accessible_attributes) 
      options = { :only => self.class.accessible_attributes.to_a }.merge(options || {}) 
      super(options) 
     else 
      super 
     end 
     end 
    RUBY 
    end 
+0

Cette méthode appelle toujours 'super()' de façon à ce qu'elle contienne ma méthode personnalisée – cpjolicoeur

0

est pas là une méthode plus simple pour remplacer la méthode to_json? L'utilisation de Devise ne résout pas le problème général. Il y a beaucoup de raisons pour lesquelles je souhaiterais choisir de ne PAS assembler certains attributs d'un objet particulier, ce qui nécessite une méthode personnalisée.

Questions connexes