在Rails 3中,如何在JSON响应中呈现HTML?

ylg*_*ylg 17 json ruby-on-rails merb

我正在将Merb 1.1/1.8.7中的应用程序移植到Rails 3(beta)/ 1.9.1,该应用程序使用包含HTML片段的JSON响应,例如,在用户记录上指定更新的JSON容器,以及更新的用户行好像 .在Merb中,因为无论控制器方法返回给客户端,都可以将Hash放在一起,将呈现的部分分配给其中一个键并返回hash.to_json(尽管这肯定不是最好的方法.)在Rails中,似乎要将数据返回给客户端必须使用渲染和渲染只能被调用一次,因此将散列渲染为json将不起作用,因为部分渲染.

从阅读开始,似乎可以将该数据放入JSON .erb视图文件中,并使用<%= render partial%>并进行渲染.是否有Rails-解决此问题的方法(返回包含一个或多个HTML片段的JSON)除此之外?

在Merb:
控制器:

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
Run Code Online (Sandbox Code Playgroud)

在Rails中:
控制器:

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
Run Code Online (Sandbox Code Playgroud)

view: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 %>
}
Run Code Online (Sandbox Code Playgroud)

ylg*_*ylg 26

我在Rails中找到的最接近Merb方法的原始方法是使用#render_to_string

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

这可以通过在混合中添加一层json.erb模板来获得相当大的复杂性,无论是Rails Purist方法我都说不出来; 通常可以使用RJS.


Jos*_*ogi -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
Run Code Online (Sandbox Code Playgroud)