2012-05-23 12 views
5

He estado viendo esto por un tiempo, y actualmente estoy perdido. Reduje el problema a estar relacionado con JSON, y parece que el JSON no parece estar siendo enviado en un formato legible.Rails 3.2 - ActiveResource - Usando POST/PUT con JSON

Anteriormente estábamos utilizando Rails 3.0.7 (donde el problema que estoy a punto de describir NO existía). Necesitamos actualizar Rails para aprovechar algunas nuevas funcionalidades, pero ahora está este problema. Estoy casi seguro de que en este punto es una configuración simple o algo así, pero necesito más atención.

Estamos utilizando objetos ActiveResource, y al establecer los valores del objeto y guardarlo (por lo tanto, hacer una PUT), obtenemos ab 403: Prohibido devuelto desde el servicio web remoto. Esto no es un problema en la capa de servicio web.

Al crear un objeto nuevo y realizar una POST, obtenemos un 409: Conflicto devuelto porque intenta actualizar la base de datos con valores predeterminados, lo que significa que los datos json no están llegando al servicio, o no es legible.

Mi problema es que esto funcionó en Rails 3.0.7, y ya no funciona en 3.2.3 (o 3.1.3 que también probé). Estoy abierto a sugerencias que no sean los datos de JSON, sin embargo, estoy bastante seguro de que ahí es donde está el problema.

Mi modelo ActiveResource tiene

self.format = :json 

Tengo el siguiente en una de mis archivos de inicializador:

ActiveResource::Base.include_root_in_json = false 
ActiveSupport::JSON.backend = "json_gem" 

Gracias por cualquier sugerencia!

ACTUALIZACIÓN

he estado probando con el enrollamiento y tengo que trabajar por:

curl -H "Content-Type: application/json" -d "{\"userID\":\"xxx\", \"label\":\"doc.test.test\", \"value\":\"1,19\", \"id\":\"-1\"}" -v -X POST http://host:port/usermanagement/users/xxx/prefs 

Tengo que trabajar, pero

  1. Parece que el contenido - El encabezado de tipo debe establecerse explícitamente; de ​​lo contrario, da como resultado un error 415: Media no reconocido

  2. Si configuro el encabezado Content-Type en el objeto ActiveResource, sigo recibiendo el 409: error de conflicto, lo que me lleva a pensar que el JSON aún no está formado correctamente.

EDITAR (Una vez más)

he dado cuenta de que el problema con el JSON es - Rieles es mantener la raíz en el JSON. Así, en lugar de enviar el recurso atrás como

{"name":"value", "name":"value"} 

Se está enviando

{"ResourceName": {"name":"value", "name":"value"}} 

Sin embargo, yo he puesto include_root_in_json en false - He intentado esto tanto en los archivos de inicializador, y directamente en el propio modelo y sin cambios

+2

Así que "fija" esta reemplazando el método 'to_json' en mi modelo a devuelva' self.attributes.to_json' - Sin embargo, si alguien tiene ideas sobre por qué la configuración 'include_root_in_json' no funciona, todavía siento mucha curiosidad ya que creo que la configuración sería una solución más elegante. ¡Gracias! – Krista

+0

Es posible que desee agregar la solución como respuesta y aceptarla ... – Smar

+0

¡Gracias! Buena idea – Krista

Respuesta

1

Así que "fija" esto (trabajaron alrededor de ella) reemplazando el método to_json en mi modelo para volver simplemente self.attributes.to_json

class Document < ActiveResource::Base 
    self.site += 'user/:user_id' 
    self.element_name = "docs" 

    def to_json(options={}) 
    self.attributes.to_json(options) 
    end 
end 
1

Parece que ActiveResource :: Base.include_root_in_json se divide en carriles 3-2- estable (incluyendo 3.2.13). Este problema se ha corregido en el repositorio ActiveResource independiente:

def to_json(options={}) 
    super(include_root_in_json ? { :root => self.class.element_name }.merge(options) : options) 
end 

Puede mono parche en uno de sus inicializadores por hacer la misma cosa.

actualización: Este problema se ha solucionado en los carriles 3-2-estables backport commit

+0

3-2-stable ha fusionado esta solicitud de parche. La próxima versión 3.2.14 incluirá esta corrección. – Dingle