2010-05-27 8 views
4

J'essaie de surcharger as_json dans l'un de mes modèles, en partie pour inclure des données d'un autre modèle, en partie pour éliminer certains champs inutiles. D'après ce que je l'ai lu est l'approche privilégiée dans Rails 3. Pour simplifier, disons que j'ai quelque chose comme:Le remplacement de as_json n'a aucun effet?

class Country < ActiveRecord::Base 
    def as_json(options={}) 
    super(
     :only => [:id,:name] 
    ) 
    end 
end 

et dans mon contrôleur simplement

def show 
    respond_to do |format| 
    format.json { render :json => @country } 
    end 
end 

Pourtant, quel que soit j'essaie, la sortie contient toujours les données complètes, les champs ne sont pas filtrés par la clause ": only". Au fond, mon remplacement ne semble pas botter, mais si je change à, disons ...

class Country < ActiveRecord::Base 
    def as_json(options={}) 
    {foo: "bar"} 
    end 
end 

... Je ne reçois en effet la sortie JSON attendue. Ai-je simplement eu la syntaxe fausse?

+0

BTW - J'ai loin après avoir lu http://jonathanjulian.com/2010/04/rails-to_json-or-as_json/ –

+0

Voir aussi http://stackoverflow.com/questions/2556468/override-as-json-or-to-json-model-class-name –

+0

Et https://rails.lighthouseapp.com/projects/8994/tickets/ 3087 –

Répondre

0

Certains autres tests, dans l'action du contrôleur:

format.json { render :json => @country } 

Et dans le modèle:

class Country < ActiveRecord::Base 
    has_many :languages 
    def as_json(options={}) 
     super(
      :include => [:languages], 
      :except => [:created_at, :updated_at] 
     ) 
    end 
end 

Sorties:

{ 
    created_at: "2010-05-27T17:54:00Z" 
    id: 123 
    name: "Uzbekistan" 
    updated_at: "2010-05-27T17:54:00Z" 
} 

Cependant, en ajoutant explicitement .to_json() à L'instruction de rendu dans la classe, et l'écrasement de to_json dans le modèle (au lieu de as_json) produit le re attendu sult. Avec ceci:

format.json { render :json => @country.to_json() } 

dans mon action du contrôleur, et ci-dessous dans le modèle, les travaux override:

class Country < ActiveRecord::Base 
    has_many :languages 
    def to_json(options={}) 
     super(
      :include => [:languages], 
      :except => [:created_at, :updated_at] 
     ) 
    end 
end 

Sorties ...

{ 
    id: 123, 
    name: "Uzbekistan", 
    languages: [ 
     {id: 1, name: "Swedish"}, 
     {id: 2, name: "Swahili"} 
    ] 
} 

... qui est le production attendue. Ai-je trouvé un bug? Est-ce que je gagne un prix?

+0

Avez-vous un plugin ou quelque chose d'installé qui définit ses propres 'to_json' ou' as_json'? – x1a4

+0

Pas que je sache, seuls les add-ons installés sont Warden, Devise et CanCan ... –