with true remote rails link_to from ruby-on-rails json merb

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 %> }



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