2010-08-26 4 views
7

J'ai des données dans Rails que je veux afficher en tant que données JSON. Ce que je fais en ce moment, c'est simplement de trouver toutes les instances d'un modèle et d'appeler render: json => data.Rails générant des données JSON avec la racine du modèle

data = Data.find(:all) 
render :json => data 

Cependant, Rails inclut le nom du modèle dans chaque objet JSON. Donc, mes données JSON finit par ressembler à ceci:

[{modelname:{propertyName: 'value',...}},{modelname:{propertyName: 'value2',...}}] 

au lieu de ceci: [{propertyName: 'valeur', ...}, {propertyName: 'valeur2', ...}]

Le nom du modèle est toujours le même et je ne veux pas qu'il soit là.

J'ai changé l'option pour rendre la racine dans les données JSON dans l'un des initialiseurs Rails mais cela affecte tout ce que je veux rendu en JSON, ce que je ne veux pas faire pour ce projet.

Dans ce cas, je veux être en mesure de le faire au cas par cas.

Comment est-ce que je peux faire ceci? Merci d'avance.

Répondre

2

Je n'ai pas trouvé un moyen de le faire en passant des options à la méthode to_json (et je ne crois pas qu'il existe une telle option). Vous avez plus d'alternative pour le faire, toute classe qui hérite de ActiveRecord :: Base aura include_root_in_json.

Faites quelque chose comme ceci.

Data.include_root_in_json = false 
data = Data.find(:all) 
render :json => data 

Espérons que ça vous va.

Ok, essayons ça alors.

DataController < ApplicationControlle 

    private 

    def custom_json(data) 
    Data.include_root_in_json = false 
    data.to_json 
    Data.include_root_in_json = true 
    data 
    end 
end 

Ensuite, votre redirect ressemblerait à ceci

data = Data.find(:all) 
render :json => custom_json(data) 

Il est assez stupide Code Je voudrais pouvoir penser à autre chose. Permettez-moi de vous poser une question: Qu'y a-t-il d'inclure le nom du modèle dans les données json?

+0

Je viens de l'essayer, et cela a pour effet de changer include_root_in_json en false globalement, malheureusement. Je cours Rails 2.3.5, si cela aide. – CCSab

1

Avec Rails 3, j'ai trouvé mieux que cela. Remplacer la as_json dans votre modèle et procédez comme suit:

def as_json(options = {}) 
    super(options.merge :methods => [:some_method_that_you_want_to_include_result], :include => {:child_relation => {:include => :grand_child_relation } }) 
end 
12

Avec Rails 3, vous pouvez utiliser active_model_serializers petit bijou 1

qui vous permet de spécifier le rendu déracinée d'un objet comme celui-ci:

render :json => data, :root => false 
+0

Cela a fonctionné très bien pour moi, bien que cette période devrait probablement être une virgule? – stickwithjosh

+1

Merci, réponse éditée pour avoir une virgule –