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

¿Fue útil?

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top