2010-08-20 3 views
0

J'ai une situation complexe. Je construis une application iPhone avec un backend de rails. Il existe deux objets de modèle, une session de discussion et une personne. Ils sont définis comme suit:Création d'une requête JSON imbriquée avec Rails

class Person < ActiveRecord::Base 
belongs_to :chatsession 
end 


class Chatsession < ActiveRecord::Base 
has_many :people 
belongs_to :leader, :class_name => "Person" 
end 

Le leader est essentiellement la personne principale pour cette session de conversation spécifique. Maintenant, depuis mon application iPhone, je veux pouvoir créer un Chatsession avec le leader en un seul appel (les appels réseau sont généralement chers sur l'iPhone et je veux donc éviter de créer un objet Person puis un objet session).

Une éventuelle demande JSON pourrait ressembler à:

{"chatsession": {"leader": {"name":"mary","device_id":"1111"}}} 

Sur mon contrôleur de chatsession dans la méthode créer je veux pouvoir aspirer dans ce JSON et avoir créer à la fois un nouvel objet de la session de chat et associés objet personne.

Le code pertinent pour ce faire serait:

class ChatsessionController < ApplicationController 
    def create 
     @chatsession = Chatsession.new(params[:chatsession]) 
    end 

Dans mon test fonctionnel, il fonctionne avec le code suivant:

test "should create session" do 
     # people(:one) is retrieving from a fixture 
     post :create, :chatsession => { :leader => people(:one) } 
     assert_response :success 
end 

Cela fonctionne très bien. Mais créer l'équivalent json ne semble pas fonctionner. Il attend une sorte d'objet Person et je ne sais pas comment le représenter. J'ai regardé la manière suivante de résoudre le problème.

http://www.rogue-development.com/blog2/2009/05/creating-nested-objects-with-json-in-rails/

Est-ce la meilleure solution ou suis-je manque quelque chose?

Répondre

2

Le poste ressemble à une excellente solution pour moi.

Dans quelle partie rencontrez-vous des problèmes?

Rails 2.1 et versions ultérieures traite automatiquement les demandes JSON entrantes. Assurez-vous simplement que votre application iPhone définit le type MIME sur JSON. Voir post qui traite également du test JSON entrant dans les publications.

+0

Merci pour ce lien. J'ai fini par prendre ces suggestions et cela fonctionne bien. J'essayais d'éviter d'utiliser les attributes_nested_attributes car je voulais essayer de faire fonctionner mes choses avec objectiveresouce (un port iphone actifesource). Il ne semble pas que objectiveresource gère l'imbrication de toute façon, donc je vais simplement lancer ma propre sérialisation JSON. Merci! – Ish

+0

Content de t'aider. Cordialement. –

1

Couple de pointeurs:

  • Assurez-vous que vous définissez l'en-tête "Content-Type" et "Accept" pour "application/json". Testez ceci en regardant/enregistrant vos paramètres; Si elles sont toutes réglées correctement, vous êtes prêt à partir.

  • Je pense que vous voulez avoir un accepts_nested_attributes_for :leader sur votre session de conversation.

  • Vous devrez peut-être ignorer le jeton d'authenticité; Votre iPhone ne l'enverra pas, et par défaut, les rails le recherchent sur les opérations de post/put.

Mais votre configuration et votre réflexion semblent bonnes.

+0

Merci pour le conseil concernant le jeton d'authenticité et pour le réglage de l'en-tête d'acceptation. – Ish

Questions connexes