2009-05-05 18 views
13

ActiveRecord introdujo un cambio en su formato de salida JSON predeterminado. Se pasó de¿Cómo consumir el formato JSON con ActiveResource de ruby?

{ "user": { some_junk } } 

a

{ some_junk } 

ActiveResource aparentemente ha seguido su ejemplo, esperando para consumir JSON como

{ some_junk } 

Estoy tratando desesperadamente de consumir un servicio web REST que emite

{ "user": { some_junk } } 

¿Hay alguna manera de decirle a mi clase ActiveResource :: Base que lo haga? Aquí está mi código.

class User < ActiveResource::Base 
    self.site = "http://example.com/" 
    self.format = :json 
end 

actualización: Estoy renunciar a ActiveResource como roto por ahora, a menos que alguien sabe la respuesta; mientras tanto, yo era capaz de lograr el GET que quería a través de

require 'httparty' # sudo gem install httparty 
result = HTTParty.get('http://foo.com/bar.json', headers => { "Foo" => "Bar"}) 
# result is a hash created from the JSON -- sweet! 

Respuesta

9

Sí, ActiveResource es actualmente un poco inflexible cuando se trata de sus formatos de datos.

En principio, la idea es que podría escribir usted mismo un módulo de formato personalizado (por ejemplo JsonWithRootFormat), basado en el módulo ActiveResource::Formats::JsonFormat, y luego especificar que como formato en su modelo:

self.format = :json_with_root 

Sin embargo, ActiveResource::Base no es muy agnóstico al formato; actualmente es does a check para ver si está usando XmlFormat, y solo pasa el nodo raíz si lo está.

Para que pueda obtener lo que desea haciendo su propio módulo de formato, y parche de mono ActiveResource::Base, pero no es ideal. Estoy seguro de que un parche para hacer que Base sea un poco más independiente del formato sería bienvenido.

0

Aquí hay una buena publicación de blog por @vaskas explicando cómo escribir su propio formateador ActiveResource personalizado.

Uso de hashes como ActiveResource Colecciones

http://vaskas.me/blog/2012/02/07/using-hashes-as-activeresource-collections/

+0

El sitio está desactivado pero el seguimiento post en su github (https://github.com/vaskas/vaskas.me/blob/master/blog/ 2012/02/07/using-hashes-as-activeresource-collections/index.html) - esencia de esto es que puedes asignar tu propio objeto de formato a 'self.format'. Cree una nueva clase, 'incluya ActiveResource :: Formats :: JsonFormat' y defina su propia función' decode'. – phillmv

Cuestiones relacionadas