12
votes

Comment construire une réponse JSON composée de plusieurs modèles dans les rails

Tout d'abord, le résultat souhaité

J'ai utilisateur code> et élément code> modèles. J'aimerais construire une réponse JSON qui ressemble à ceci: p> xxx pré>

Cependant, mon 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 méfiez-vous strong>, ce n'est pas joli ... S'il vous plaît aider ... p>

Mise à jour h3>

La section suivante contient la question initiale. La dernière section montre la nouvelle solution. P>


Mes hacks h2>

home_controller.rb h3> xxx pré>

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


0 commentaires

4 Réponses :


10
votes

édité à utiliser as_json au lieu de to_json . Voir Comment remplacer TO_JSON dans les rails? pour un explication détaillée. Je pense que c'est la meilleure réponse.

Vous pouvez rendre le JSON que vous voulez dans le contrôleur sans avoir besoin de la nécessité du modèle d'aide. xxx

Assurez-vous ActionCord :: base.include_root_in_json 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 à chaque élément, de sorte que le collecte est nécessaire.


8 commentaires

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 que nous nous "connaissons tous"?


@Jonathan Julian, activeCord :: base.include_root_in_json est défini sur false et cela fait exactement ce que je attendu , mais pas exactement ce que je < J'ai espéré pour. Les appels internes to_json se sont échappés par rendu: JSON . Par exemple, au lieu de {"utilisateur": {"Nom d'utilisateur": "BOB!"}} Je reçois {"Utilisateur": "{\" nom d'utilisateur \ ": ! \ "}"} :(


@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 ...}


@smotchkkss Vous pouvez toujours RENDRE: JSON => {} et construit simplement ce hachage à la main sans appelant à_json sur les modèles. Ou utilisez décodez 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"} est valide, {'A': "foo"} n'est pas. Comme vous, je préfère toujours le {: foo => "bar"} notation :)


@Jonathan Julian, merci encore. J'ai mis à jour la question initiale pour afficher l'application du nouveau as_json de remplacement également. Cela me rend très heureux :)



-1
votes

Réponse de travail n ° 2 Pour éviter que votre JSON soit "échappé", construisez la structure de données à la main, appelez-vous à_json sur elle une fois . 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 ou quelque chose. XXX


3 commentaires

Découvrez pourquoi j'avais mon "remplacement to_json dans Rails 2.3.5" ( Stackoverflow.com/Questtions/2572284/... ) Question avant? ;)


Pour résoudre vos problèmes, créez un to_hash 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 pour lire @ items.collect . Array # Chaque renvoie le tableau @items d'origine . 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 ou to_json 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 :)



0
votes

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:

https://github.com/bsiggiedelkow/jsonify https://github.com/bsiggelkow/jsonify-Rails

Cela vous permet d'accumuler le mélange d'attributs et de tableaux de vos modèles.


0 commentaires

1
votes

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


0 commentaires