rails fastjsonapi fastjson fast_jsonapi fast ruby-on-rails ruby json serialization xml-serialization

fastjsonapi - Ruby on Rails Advanced JSON Serialización



rails fast_jsonapi (7)

(Por favor acepte una respuesta)

Creo que el enlace que dio nirvdrum tiene su respuesta. Solo respondo porque nadie ha mencionado encode_json .

En tu caso solo deberías estar tratando con as_json . Ya sea construyendo un hash (con varias llamadas a as_json ) y enviando eso a render :json => ... (sin la llamada a to_json ) o simplemente implementando as_json en su modelo y dejando que los rieles hagan todo el trabajo. (Pero sospecho que necesitarás lo primero).

Si realmente necesitas algunos js de fantasía en tu respuesta renderizada, entonces puedes implementar encode_json en tus clases (de nuevo, no to_json ). Por ejemplo:

class JsEmptyClosure def encode_json(*args) "jQuery[/"noop/"] || function(){}" end def as_json(*args) self end end

Esto ahora responderá a to_json con js válidos (pero tenga en cuenta que en realidad no es json).

Estoy buscando generar un índice de todos los artículos junto con un artículo completo a través de JSON en mi aplicación Rails, pero me cuesta un poco averiguar cómo hacerlo.

Aquí está mi controlador ahora:

if params[:id] @article = Article.find(params[:id]) else @article = Article.published.not_draft.by_recent.first end respond_to do |format| format.js { render :json => @article.to_json( :except => [ :created_at, :updated_at, :draft, :id, :publish ], :include => { :comments => { :only => [:body] } }), :callback => params[:callback]} end

Lo que me gustaría hacer en la respuesta es agregar un índice de todos los artículos, así:

@index = Article.find(:all, :select => ''id, title'')

La única forma en que he podido hacerlo, es poner tanto el índice como el artículo en un hash o matriz y luego colocarlo en JSON.

@response = { :item => @article, :index => @index }

Código completo con ambos:

@index = Article.find(:all, :select => ''id, title'') if params[:id] @article = Article.find(params[:id]) else @article = Article.published.not_draft.by_recent.first end @response = { :item => @article, :index => @index } respond_to do |format| format.js { render :json => @response.to_json(), :callback => params[:callback]} end

Esto estaría bien, excepto que ahora no puedo especificar :include o :except y hacer que se procese correctamente.


Debería poder anidar el :include :except , etc. así:

:except => {:item => [ :created_at, :updated_at, :draft, :id, :publish ]}...

Si eso no funciona, conviértalo en un objeto (por ejemplo, un OpenStruct) en lugar de un hash.

- Markus


Gracias por la pregunta, puedo personalizar mi formato json para un modelo con varias asociaciones.

render json: @ posts.to_json (

: except => [: created_at,: updated_at,: user_id],

: include => {

: usuario => {: solo => [: correo electrónico,: teléfono]},

: location => {: only => [: title,: lat,: lon,: street,: city,: state,: zipcode]},

: uploads => {: only => [: image]}

}
)


Para que quede claro, el código anterior funciona con: include y: except. Y por obras quiero decir que no arroja un error. El problema es que incluye comentarios para cada artículo en el índice. Solo busco incluir comentarios para el artículo y no ninguno de los artículos que figuran en el índice.

No pude hacer que el agrupamiento funcione como un hash o un objeto OpenStruct.

Anidar en: incluir arroja un error, anidar en: excepto que no arroja un error, pero no se filtra nada,: created_at, etc. todavía se muestran.

... @response = { :item => @article, :index => @index } format.js { render :json => @response.to_json( :except => {:item => [ :created_at, :updated_at, :draft, :id, :publish ]}, :include => { :item => { :comments => { :only => [:body] } }}), :callback => params[:callback]} end


Recomendaría sobrecargar el método de atributos para devolver un hash alternativo que se usará automáticamente en la salida to_json.

class Article def attributes { ... } # define your hash that you want to return at the ''...'' end end

Para mí, esto parece mucho más sencillo que jugar con to_json directamente.


Usted insinúa la solución en su pregunta. Es muy probable que desee crear un hash para renderizar a JSON. La forma preferida de hacerlo ahora es proporcionar una implementación para el método as_json. as_json proporciona un medio formal para personalizar la salida de to_json mediante la creación de un hash que contiene los datos que desea codificar.

Puede encontrar un tratamiento más completo de cómo interactúan as_json y to_json en el weblog de Jonathan Julian .


to_json tiene una opción de método que incluye el resultado de cualquier método que nombre, puede definir un método en ese modelo que devuelva los datos adicionales que desea en su JSON.