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

Author: Matthew, 2010-01-18

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.

 62
Author: Alex Reisner,
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 %>"
}
 53
Author: erik,
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.

RABL

Buena solución. Hay que añadir una dependencia y aprender su DSL.

Generador de JSON

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

 29
Author: tybro0103,
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

Https://github.com/nesquena/rabl

 27
Author: zapnap,
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 %>"
}
 21
Author: James Lim,
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 %>
 9
Author: Priit,
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

 6
Author: PETER BROWN,
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