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.