Le contrôleur Rails n'accepte pas le JSON?
-
03-07-2019 - |
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
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