2010-01-18 15 views
118

Supongamos que está en su controlador de usuario y desea obtener una respuesta json para una solicitud de espectáculo, sería bueno si pudiera crear un archivo en sus vistas/usuarios/dir, llamado show.json y después de sus usuarios #show action se completa, renderiza el archivo.En Rails, ¿cómo renderizas JSON usando una vista?

la actualidad que tiene que hacer algo en la línea de:

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 pudiera crear un archivo show.json la que automáticamente se vuelve de este modo:

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 eliminaría esa sensación horrible que tengo cuando renderizo mi json en el controlador

+0

Mirando esta publicación ahora, parece que esto no me ahorraría mucho, pero tengo casos más complicados, confía en mí cuando digo que esto me está causando dolores de cabeza – Matthew

+1

En Rails 3, puedes simplemente llamar a 'format.json' con un archivo 'show.json.erb'. Ver mi respuesta –

Respuesta

61

Debería poder hacer algo como esto s en su bloque respond_to:

format.json render :partial => "users/show.json" 

que hacer que la plantilla en app/views/users/_show.json.erb.

+5

Esto es bueno, pero rápidamente encontrará que erb es una forma dolorosa de generar json. Mira mi respuesta para algunas alternativas. – tybro0103

+1

¿Hay alguna forma de hacerlo sin usar un parcial? –

53

Trate de añadir una vista users/show.json.erb Esto debería traducirse al realizar una solicitud para el formato JSON, y se obtiene el beneficio añadido de que sea dictada por erb también, por lo que su archivo podría ser algo como esto

{ 
    "first_name": "<%= @user.first_name.to_json %>", 
    "last_name": "<%= @user.last_name.to_json %>" 
} 
+9

Es posible que desee utilizar '@ user.first_name.to_json' en lugar de' escape_javascript'. Existen algunas diferencias sutiles entre lo que JS permite y lo que es * estrictamente * JSON. (Y esas diferencias se están volviendo importantes a medida que los navegadores implementan sus propios analizadores JSON). –

+0

Gracias por la sugerencia; Actualicé la respuesta. – erik

+1

Probablemente debería cambiar las comillas simples por comillas dobles, ya que JSON (a diferencia de JS) solo acepta cadenas entre comillas dobles. –

9

Sólo tiene que añadir show.json.erb archivo con el contenido

<%= @user.to_json %> 

a veces es útil cuando se necesita algunos métodos auxiliares adicionales que no están disponibles en el controlador, es decir, image_path(@user.avatar) o algo adicional para generar propiedades en JSON:

<%= @user.attributes.merge(:avatar => image_path(@user.avatar)).to_json %> 
+7

Necesitaría ser '<% = raw (@ user.to_json)%>' para evitar el escape de HTML. Lo que hago es confiar en to_json, siempre y cuando me dé lo que quiero, pero cuando quiero hacer otra cosa, lo configuro con lo que generalmente es un '{: blah => @ user.the_blah} .to_json'. – clacke

27

RABL es probablemente la solución más bonito a esto que he visto, si usted está buscando una alternativa más limpia a Sintaxis ERb json_builder y argonaut, que son otras soluciones, ambas parecen anticuadas 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 de GitHub; buenos ejemplos demasiado

https://github.com/nesquena/rabl

21

Sólo para actualizar esta respuesta por el bien de otros que suceden a terminar 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 (igual que para html.) Ya no necesita to_json.

En resumen, es sólo

# 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 %>" 
} 
+1

Respondí esto hace 1,5 años. Actualmente solo uso reply_with cuando necesito JSON, p. Ej. 'responder_con @usuario, solo: [: nombre]'. Consulte este [tutorial] (http://bendyworks.com/geekville/tutorials/2012/6/respond-with-an-explanation) para obtener más información. –

+1

Solo para agregar a esta respuesta, esto es realmente peligroso por dos razones: permite la inyección de los datos del usuario porque no escapa a las nuevas líneas y barras diagonales inversas, y también <% = html escapa de los datos, por ejemplo, Sean O'Connor tendrá su nombre destrozado a Sean O ' Connor. – d4n3

28

Como ya han dicho que necesita un usuario/espectáculo.Ver JSON, pero hay opciones a considerar para el lenguaje de plantillas ...

ERB

funciona fuera de la caja. Ideal para HTML, pero rápidamente descubrirá que es horrible para JSON.

RABL

buena solución. Tiene que agregar una dependencia y aprender su DSL.

JSON Builder

mismo acuerdo que RABL: Buena solución. Tiene que agregar una dependencia y aprender su DSL.

Llanura Rubí

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. Sólo tiene que registrar la extensión .rb para las plantillas (en un inicializador):

ActionView::Template.register_template_handler(:rb, :source.to_proc) 

A continuación, crear la vista de los usuarios/show.json.rb:

@user.to_json 

Para obtener más información sobre este enfoque ver http://railscasts.com/episodes/379-template-handlers

+7

Tenga en cuenta que en los rieles 4, el controlador de plantilla .ruby se registra de manera predeterminada https://github.com/rails/rails/commit/de1060f4e02925c12004f2, por lo que puede omitir el registro de .rb y el nombre de su archivo users/show.json.ruby. –

+1

Además, para actualizar esto aún más, json_builder ha sido reemplazado por https://github.com/rails/jbuilder. –

Cuestiones relacionadas