ruby on rails - true - En Rails 3, ¿cómo se representa HTML en una respuesta JSON?
remote true rails (3)
Estoy portando una aplicación de Merb 1.1 / 1.8.7 a Rails 3 (beta) / 1.9.1 que usa respuestas JSON que contienen fragmentos HTML, por ejemplo, un contenedor JSON que especifica una actualización, en un registro de usuario y la fila de usuario actualizada parece . En Merb, dado que todo lo que devuelve un método de controlador se le da al cliente, uno puede armar un Hash, asignar un parcial renderizado a una de las claves y devolver el hash.to_json (aunque eso puede no ser la mejor manera). Parece que, para obtener datos de vuelta al cliente, uno debe usar render y render solo se puede llamar una vez, por lo que renderizar el hash a json no funcionará debido al render parcial.
Al leer alrededor, parece que uno podría poner esos datos en un archivo de vista .erb de JSON, con <% = render partial%> y renderizar eso. ¿Existe una forma de Rails de resolver este problema (devolver JSON que contiene uno o más fragmentos de 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 rieles:
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 / mensaje-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 %>
}
Hay otra pregunta que tiene más soluciones para los archivos json.erb. Ver plantilla json erb no puede encontrar otro html parcial
Lo más cercano al enfoque original de Merb que pude encontrar en Rails es usar #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 evita un poco de complejidad que viene de agregar una capa de plantillas json.erb a la mezcla, ya sea el enfoque de Rails Purist que no podría decir; Posiblemente se usaría algo con RJS.
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