Réponses
Trop de publicités?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]) }