Question

J'essaie de créer un objet ActiveRecord via une requête JSON. Cependant, le contrôleur ne parvient pas à définir les variables passées dans les paramètres du nouvel objet créé. Par exemple, un objet personne a deux champs: prénom et nom.

Le JSON généré par la fonction JSON.stringify de la bibliothèque JSON.org produit:

{"firstname" : "Joe" , "lastname" : "Bloggs"}

Cependant, le contrôleur s'attend à ce que le JSON se présente sous la forme:

{ "Person" : {"firstname" : "Joe" , "lastname" : "Bloggs"} }

Je suis conscient que dans le cours normal des événements (pour les requêtes HTTP), le les paramètres de la demande sont imbriqués sous le nom de classe du modèle Étant créé.

L'action de création dans le contrôleur est la suivante:

def create
    @person = Person.new(params[:person])

    respond_to do |format|
      if @person.save
        flash[:notice] = 'Person was successfully created.'
        format.html { redirect_to(@person) }
        format.xml  { render :xml => @person, :status => :created, :location => @person }
        format.json  { render :json => @person, :status => :created, :location => @person }
      else
        format.html { render :action => "new" }
        format.xml  { render :xml => @person.errors, :status => :unprocessable_entity }
        format.json  { render :json => @person.errors, :status => :unprocessable_entity }
      end
    end
  end

Quel serait le meilleur moyen pour le contrôleur de traiter le JSON demandes telles que générées? Ou encore, comment générez-vous " correct " JSON à partir d’objets Javascript pour passer à vos contrôleurs?

TIA, Adam

Était-ce utile?

La solution

Si vous ne faites que transmettre un hachage de tous les paramètres de la personne (plutôt qu'un hachage imbriqué avec "personne" comme clé), vous devriez simplement pouvoir faire @person = Person.new ( params) .

Autres conseils

Comme pour ActiveRecord 3.0.7, vous pouvez simplement ajouter

self.include_root_in_json = false

à votre modèle (personne.rb) pour vous débarrasser de la racine ({"Personne"): ").

  

Alternativement, Person.new (params.reject {| k, v | k! = "prénom |" || k! = "nom de famille")) ferait cela dans votre Ruby.

     

...

     

Personne.nouveau ({: prénom = = params [: prénom],: nom = = params [: nom]}) - cela fonctionne réellement

Voici une solution plus pérenne:

Person.new(params.reject{|k,v| not Person.column_names.include?(k) })

Une idée permettant d'autoriser une entrée JSON plate telle que {"prénom": "Joe", "nom": "Bloggs"} et le type imbriqué que vous obtenez avec un formulaire HTML serait:

@person = Person.new(params[:person] || params)

respond_to do |format|
  ..
end
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top