Controlador de rieles no acepta JSON?
-
03-07-2019 - |
Pregunta
Estoy intentando crear un objeto ActiveRecord a través de una solicitud JSON. Sin embargo, el controlador no puede establecer las variables pasadas en los parámetros en el objeto recién creado. Como ejemplo, un objeto de persona tiene dos campos: nombre y apellido.
El JSON generado por la función JSON.stringify de la biblioteca JSON.org produce:
{"firstname" : "Joe" , "lastname" : "Bloggs"}
Sin embargo, el controlador espera que el JSON esté en la forma:
{ "Person" : {"firstname" : "Joe" , "lastname" : "Bloggs"} }
Soy consciente de que en el curso normal de los eventos (para solicitudes HTTP) el los parámetros para la solicitud se anidan bajo el nombre de clase del modelo siendo creado.
La acción de crear en el controlador es:
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
¿Cuál sería la mejor manera para que el controlador procese el JSON? peticiones como generadas? O alternativamente, ¿cómo se genera " correcto " ¿JSON de los objetos de Javascript para pasar a sus controladores?
TIA, Adán
Solución
Si solo está pasando un hash de todos los parámetros de persona (en lugar de un hash anidado con " persona " como clave), entonces debería poder hacer @person = Person.new ( params)
.
Otros consejos
En cuanto a ActiveRecord 3.0.7, simplemente puede agregar
self.include_root_in_json = false
a tu modelo (person.rb) para deshacerte de la parte raíz ({" Person ": ")
Alternativamente,
Person.new (params.reject {| k, v | k! = " primer nombre " || k! = " lastname "})
haría en tu Ruby....
Person.new ({: firstname = > params [: firstname],: lastname = > params [: lastname]})
- esto realmente funciona
Aquí hay una solución más a prueba de futuro:
Person.new(params.reject{|k,v| not Person.column_names.include?(k) })
Una idea para permitir una entrada JSON plana como {" nombre de pila " ;: " Joe " ;, " nombre de pila " ;: " Bloggs "} y el tipo anidado que obtenga con un formulario HTML sería:
@person = Person.new(params[:person] || params)
respond_to do |format|
..
end