En Rails, ¿cómo renderiza JSON usando una vista?
Supongamos que está en su controlador de usuarios y desea obtener una respuesta json para una solicitud de show, sería bueno si pudiera crear un archivo en su views/users/ dir, llamado show.json y después de que se complete la acción users#show, renderiza el archivo.
Actualmente necesitas hacer algo como:
def show
@user = User.find( params[:id] )
respond_to do |format|
format.html
format.json{
render :json => @user.to_json
}
end
end
Pero sería bueno si pudieras crear un espectáculo.archivo json que se renderiza automáticamente de la siguiente manera:
def show
@user = User.find( params[:id] )
respond_to do |format|
format.html
format.json
end
end
Esto me ahorraría toneladas de dolor, y lavaría esa sensación horriblemente sucia que tengo cuando renderizo mi json en el controlador
7 answers
Deberías poder hacer algo como esto en tu bloque respond_to
:
respond_to do |format|
format.json
render :partial => "users/show.json"
end
Que mostrará la plantilla en app/views/users/_show.json.erb
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-15 12:01:54
Intente agregar una vista users/show.json.erb
Esto debería ser renderizado cuando realice una solicitud para el formato JSON, y obtendrá el beneficio adicional de ser renderizado por erb también, por lo que su archivo podría verse algo como esto
{
"first_name": "<%= @user.first_name.to_json %>",
"last_name": "<%= @user.last_name.to_json %>"
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-04-16 13:58:40
Como otros han mencionado, necesita un users/show.vista json, pero hay opciones a considerar para el lenguaje de plantillas...
ERB
Funciona fuera de la caja. Genial para HTML, pero rápidamente descubrirás que es horrible para JSON.
Buena solución. Hay que añadir una dependencia y aprender su DSL.
El mismo trato que RABL: Buena solución. Tener que añadir una dependencia y aprender su DSL.
Rubí llano
Ruby es impresionante en la generación de JSON y no hay nada nuevo que aprender como se puede llamar to_json
en un Hash o un objeto AR. Simplemente registre el .extensión rb para plantillas (en un inicializador):
ActionView::Template.register_template_handler(:rb, :source.to_proc)
Luego cree la vista users/show.json.rb:
@user.to_json
Para más información sobre este enfoque ver http://railscasts.com/episodes/379-template-handlers
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-21 14:53:46
RABL es probablemente la mejor solución para esto que he visto si está buscando una alternativa más limpia a la sintaxis ERb. json_builder y argonaut, que son otras soluciones, parecen algo obsoletas y no funcionarán con Rails 3.1 sin algunos parches.
RABL está disponible a través de una gema o echa un vistazo al repositorio GitHub; buenos ejemplos también
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-28 21:47:04
Solo para actualizar esta respuesta por el bien de otros que terminan en esta página.
En Rails 3, solo necesita crear un archivo en views/users/show.json.erb
. El objeto @user
estará disponible para la vista (al igual que lo estaría para html.) Ya no necesitas to_json
.
Para resumir, es solo
# users contoller
def show
@user = User.find( params[:id] )
respond_to do |format|
format.html
format.json
end
end
Y
/* views/users/show.json.erb */
{
"name" : "<%= @user.name %>"
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-05 15:39:53
Simplemente agregue show.json.erb
el archivo con el contenido
<%= @user.to_json %>
A veces es útil cuando necesita algunos métodos auxiliares adicionales que no están disponibles en el controlador, es decir, image_path(@user.avatar)
o algo para generar propiedades adicionales en JSON:
<%= @user.attributes.merge(:avatar => image_path(@user.avatar)).to_json %>
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-18 18:48:59
Esta es potencialmente una mejor opción y más rápida que ERB: https://github.com/dewski/json_builder
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-05 17:59:41