J'ai Cependant, mon La section suivante contient la question initiale. La dernière section montre la nouvelle solution. P> utilisateur code> et
élément code> modèles. J'aimerais construire une réponse JSON qui ressemble à ceci: p>
utilisateur code> et
élément code> modèle code> avoir plus d'attributs que de ceux-ci. J'ai trouvé un moyen de faire fonctionner cela, mais
Mise à jour h3>
Mes hacks h2>
home_controller.rb h3>
observation.rb H3>
class HomeController < ApplicationController
def observe
@items = Items.find(...)
respond_to do |format|
format.js do
render :json => {
:user => current_user || {},
:items => @items
}
end
end
end
end
4 Réponses :
édité fort> à utiliser Vous pouvez rendre le JSON que vous voulez dans le contrôleur sans avoir besoin de la nécessité du modèle d'aide. P> Assurez-vous as_json code> au lieu de
to_json code>. Voir Comment remplacer TO_JSON dans les rails? pour un explication détaillée. Je pense que c'est la meilleure réponse.
ActionCord :: base.include_root_in_json code> est défini sur FALSE ou d'autres que vous obtiendrez un attribut "utilisateur" à l'intérieur de "utilisateur". Malheureusement, il semble que les tableaux ne passent pas les options
code> à chaque élément, de sorte que le
collecte code> est nécessaire. P> p>
La syntaxe de hachage que vous utilisez est seulement de 1,9 et peut confondre toute personne qui ne le connaît pas. Puis-je suggérer de changer cela pour être le standard "utilisateur" => actuel code> que nous nous "connaissons tous"?
@Jonathan Julian, activeCord :: base.include_root_in_json code> est défini sur
false code> et cela fait exactement ce que je attendu i>, mais pas exactement ce que je < J'ai espéré I> pour. Les appels internes
to_json code> se sont échappés par
rendu: JSON code>. Par exemple, au lieu de
{"utilisateur": {"Nom d'utilisateur": "BOB!"}} Code> Je reçois
{"Utilisateur": "{\" nom d'utilisateur \ ": ! \ "}"} code> :(
@Ryan Fixe Syntaxe de hachage pour être rubis 1.8 Style
@Ryan Bigg, c'est en fait une faute de frappe. (Et une erreur de syntaxe, jamais pour Ruby 1.9). Il signifie {: user => actuel_user ...} code>
@smotchkkss Vous pouvez toujours RENDRE: JSON => {} CODE> et construit simplement ce hachage à la main sans i> appelant à_json sur les modèles. Ou utilisez
décodez code> comme vous avez déjà trouvé. De toute façon, il n'y a pas besoin d'un modèle séparé.
@Jonathan Julian, merci d'avoir donné un coup de feu. Vous voudrez peut-être faire une note "ne fonctionne pas" quelque part dans votre réponse afin que les gens ne poursuivent pas la même impasse que j'ai faite. +1 pour effort
@Ryan Bigg, j'ai un peu examiné cette nouvelle syntaxe. {A: "FOO"} code> est valide,
{'A': "foo"} code> n'est pas. Comme vous, je préfère toujours le
{: foo => "bar"} code> notation :)
@Jonathan Julian, merci encore. J'ai mis à jour la question initiale pour afficher l'application du nouveau as_json code> de remplacement également. Cela me rend très heureux :)
Réponse de travail n ° 2 forte> Pour éviter que votre JSON soit "échappé", construisez la structure de données à la main, appelez-vous à_json sur elle une fois em>. Il peut obtenir un peu de ver que, mais vous pouvez tout faire dans le contrôleur, ou résumé à côté des modèles individuels tels que to_hash code> ou quelque chose.
Découvrez pourquoi j'avais mon "remplacement to_json code> dans Rails 2.3.5" ( Stackoverflow.com/Questtions/2572284/... ) Question avant? ;)
Pour résoudre vos problèmes, créez un to_hash code> dans chacun de vos modèles et construisez-les vous-même. Trade off un peu de code pour quelques maux de tête.
Veuillez mettre à jour @ items.ache code> pour lire
@ items.collect code>.
Array # Chaque code> renvoie le tableau
@items d'origine code>. Ceci est seulement légèrement plus propre que ce que j'avais auparavant, mais cela semble toujours que je devrais pouvoir appuyer sur le
as_json code> ou
to_json code> méthodes d'une manière ou d'une autre; Je veux dire, c'est ce qu'ils sont pour. Il est très possible que beaucoup d'autres objets apparaissent dans le hachage "Observation", ainsi que tout ce travail supplémentaire pour chacun semble être un mal de tête. Si une réponse plus appropriée n'apparaît pas dans quelques jours, je vais marquer cela comme accepté. Merci encore :)
Il y a beaucoup de nouveaux gemmes pour la construction de JSON maintenant, car ce cas, le plus approprié que j'ai trouvé est JSONIFY: P>
https://github.com/bsiggiedelkow/jsonify https://github.com/bsiggelkow/jsonify-Rails p>
Cela vous permet d'accumuler le mélange d'attributs et de tableaux de vos modèles. P>
Incase Tout le monde cherche une solution alternative à cela, c'est ainsi que j'ai résolu ceci dans les rails 4.2:
def observe @item = some_item @user = some_user respond_to do |format| format.js do serialized_item = ItemSerializer.new(@item).attributes serialized_user = UserSerializer.new(@user).attributes render :json => { :item => serialized_item, :user => serialized_user } end end end