93 votes

Comment remplacer to_json dans Rails?


208voto

Jonathan Julian Points 9172

Vous êtes l'obtention ArgumentError: wrong number of arguments (1 for 0) car to_json doit être substituée avec un seul paramètre, l' options de hachage.

def to_json(options)
  ...
end

Une longue explication de l' to_json, as_json, et le rendu:

Dans ActiveSupport 2.3.3, as_json a été ajouté à l'adresse des questions comme l'un que vous avez rencontré. La création de l'json doit être distincte de l' rendu au format json.

Désormais, à chaque fois to_json est appelée sur un objet, as_json est appelé pour créer la structure de données, puis de celle de hachage est codé comme une chaîne JSON à l'aide de ActiveSupport::json.encode. Cela se produit pour tous les types: objet, numérique, date, chaîne, etc (voir le ActiveSupport code).

ActiveRecord objets se comportent de la même façon. Il y a un défaut as_json mise en œuvre qui crée une table de hachage qui contient tous les attributs du modèle. Vous devez remplacer as_json de votre Modèle pour créer la structure JSON que vous voulez. as_json, tout comme le vieux - to_json, prend une option de hachage où vous pouvez spécifier les attributs et méthodes pour inclure de manière déclarative.

def as_json(options)
  # this example ignores the user's options
  super(:only => [:email, :handle])
end

Dans votre contrôleur, render :json => o peut accepter une chaîne ou un objet. Si c'est une chaîne, il est passé à travers le corps de la réponse, si c'est un objet, to_json est appelée, ce qui déclenche as_json comme expliqué ci-dessus.

Donc, tant que vos modèles sont correctement représentés avec as_json remplace (ou pas), votre contrôleur de code pour afficher un modèle devrait ressembler à ceci:

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

La morale de l'histoire est: Éviter d'appeler to_json directement, laissez render le faire pour vous. Si vous avez besoin d'ajuster la sortie JSON, appel as_json.

format.json { render :json => 
    @user.as_json(:only => [:username], :methods => [:avatar]) }

71voto

Sam Soffes Points 8034

Si vous rencontrez des problèmes avec cela en 3 Rails, substituer au lieu de . Ceci obtiendra votre XML mise en forme gratuite trop  :)

Cela m’a pris pour toujours pour comprendre. Espoir qui aide quelqu'un.

34voto

Danpe Points 4080

Pour les personnes qui ne veulent pas d’ignorer les options d’utilisateurs, mais aussi ajouter leurs de :

Espérons que cela aide quelqu'un  :)

3voto

glebm Points 6620

Substituez pas to_json, mais as_json. Et d’as_json appelez ce que vous voulez :

Essayez ceci :

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X