2010-10-10 2 views
1

Je suis sûr qu'il existe une solution simple pour cela, mais je suis nouveau sur Rails et j'ai besoin d'aide pour la syntaxe.Rails 2.3.8: comment analyser JSON avec des noms de champs autres que les colonnes DB

Dans mon contrôleur je:

@products = Product.all 
format.json { render :json => @products } 

Et il fonctionne très bien, les données de retour avec les noms de colonnes par défaut utilisés dans le DB:

"product": { 
    "created_at": "2010-10-08T17:24:27Z", 
    "id": 24, 
    "product_date": "2010-08-08", 
    "product_name": "Product One", 
    "updated_at": "2010-10-08T17:36:00Z" 
} 

Ce que je besoin est quelque chose comme:

"product": { 
    "created_at": "2010-10-08T17:24:27Z", 
    "id": 24, 
    "start": "2010-08-08", 
    "title": "Product One", 
    "updated_at": "2010-10-08T17:36:00Z" 
} 

En d'autres termes, en changeant product_date à démarrer et nom_produit à titre, mais uniquement dans la sortie JSON.

Cela semble être un problème facile à résoudre mais je ne suis pas sûr de savoir comment l'exprimer en syntaxe Ruby/Rails, donc j'apprécierais vraiment toute aide. Je ne peux pas renommer les colonnes de la base de données.

+0

Avez-vous besoin de le remplacer uniquement pour une action spécifique, ou chaque fois qu'un produit est sérialisé à json? – jason

+0

À chaque fois. Je veux utiliser un plugin jQuery qui nécessite des noms de champs spécifiques pour les données JSON qui lui sont passées. Je voudrais pouvoir utiliser la même action pour rendre XML (avec les noms de champs par défaut), et JSON avec les noms de champs modifiés. Aurais-je peut-être créer une nouvelle variable pour les données JSON, ou faire quelque chose dans l'instruction de rendu? – pthesis

+0

Si quelqu'un d'autre est en mesure d'offrir un aperçu qui serait vraiment apprécié! – pthesis

Répondre

1

Si vous souhaitez modifier la sortie JSON pour tous les produits, partout et en permanence, remplacez simplement la méthode to_json sur votre modèle de produit.

est ici la façon simple de le faire (dans la définition de classe de produit):

def to_json 
    ActiveSupport::JSON.encode({ 
    :created_at => created_at 
    :id => id 
    :start => product_date 
    :title => product_name 
    :updated_at => updated_at 
    }) 
end 

Vous pourriez obtenir colombophile et brancher une coutume sérialiseur, mais cela devrait suffire à vos besoins. Un inconvénient de le faire si explicitement est que si votre schéma change, cela devra être mis à jour. Cela va également casser les options habituellement disponibles à la méthode to_json (:include, :only, etc) alors, peut-être que ce n'est pas trop chaud.

+0

Je savais que ce serait facile, mais je ne savais pas comment s'y prendre. Merci Jason. Juste par curiosité, comment vous y prendre si vous ne voulez pas modifier la sortie JSON à l'échelle de l'application? Je m'intéresse principalement à la différence de syntaxe entre les deux situations. – pthesis

+0

Hmm, un moyen simple serait de simplement construire un nouveau hachage à passer à 'render'. – jason

+0

Je reçois une erreur "nombre d'arguments incorrect" essayant d'accéder aux données JSON avec la méthode ci-dessus dans mon modèle. Des pensées? – pthesis

Questions connexes