2010-03-17 20 views
17

Estoy portando una aplicación de Merb 1.1/1.8.7 a Rails 3 (beta)/1.9.1 que utiliza respuestas JSON que contienen fragmentos HTML, por ejemplo, un contenedor JSON que especifica una actualización, en un registro de usuario y la actualización fila de usuario parece. En Merb, dado que cualquier cosa que un método de control devuelva se le da al cliente, uno puede juntar un Hash, asignar un parcial renderizado a una de las teclas y devolver hash.to_json (aunque ciertamente no sea la mejor manera). En Rails , parece que para devolver los datos al cliente uno debe usar el renderizado y el renderizado solo se puede llamar una vez, por lo que renderizar el hash a json no funcionará debido a la renderización parcial.En Rails 3, ¿cómo se renderiza HTML dentro de una respuesta JSON?

A partir de la lectura, parece que uno podría poner esos datos en un archivo de vista .erb JSON, con <% = render parcial%> en y renderizar eso. ¿Existe un modo Rails de resolver este problema (devolver JSON que contenga uno o más fragmentos HTML) aparte de eso?

En Merb:
controlador:

only_provides :json 
... 
self.status = 204 # or appropriate if not async 
return { 
    'action' => 'update', 
     'type' => 'user', 
     'id' => @user.id, 
     'html' => partial('user_row', format: :html, user: @user) 
}.to_json 

En Rails:
controlador:

respond_to do |format| 
    format.json do 
    render template: '/json/message-1', 
     locals: { 
     action: 'update', 
     type: 'user', 
     id: @user.id, 
     partial: 'user_row.html.erb', 
     locals: { user: @user } 
     } 
    end 
end 

vista: json/message-1.json.erb

{ 
    "action": <%= raw action.to_json %>, 
    "type": <%= raw type.to_json %>, 
    "id": <%= raw id.to_json %>, 
    "html": <%= raw render(partial: partial, locals: locals).to_json %> 
} 
+0

Mi respuesta a una pregunta similar http://stackoverflow.com/a/15574453/667598 –

Respuesta

-12
class UsersController < ApplicationController 
    respond_to :json 

    def show 
    @user = User.find(params[:id]) 
    respond_with(@user) do |format| 
     if @user.save 
     format.json { render :json => @user } 
     else 
     format.json { render :json => @user.errors, :status => :unprocessable_entity } 
     end 
    end 
    end 
end 
+0

Probablemente me esté faltando el punto: la única manera que puedo ver en este ejemplo para obtener fragmentos HTML en el JSON sería Implementar #to_json en User y hacer que represente parciales, lo que presumiblemente sería incompatible con el doble problema de renderizado e, incluso si no fuera así, no permitiría usar diferentes fragmentos en diferentes contextos, por ejemplo, user_row v. user_detail. ¿Hay algo aquí que no estoy recibiendo? – ylg

26

La más cercana a la original de enfoque Merb que pude encontrar en Rails es utilizar #render_to_string

render json: { 
    'action' => 'update', 
    'type' => 'user', 
     'id' => @user.id, 
    'html' => render_to_string(partial: 'user_row.html.erb', locals: { user: @user }) 
} 

Esto se pone alrededor de un poco de complejidad que viene de la adición de una capa de plantillas json.erb en la mezcla, no puedo decir si es el enfoque de Rails Purist; posiblemente se use algo con RJS.

+0

¡Gracias, estaba buscando este método "render_to_string"! – Robin

+1

Me di cuenta de que también puede agregar .html como extensión, el .erb se agregará automáticamente, útil si está usando slim (.slim) –

+0

me ayudó el método render_to_string ... gracias .. – Abhi

Cuestiones relacionadas