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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (13)

我将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

在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

查看: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 %>
}
提问于
用户回答回答于

还有解决方案json.erb文件。但我暂时不知道。

用户回答回答于

我可以在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 })
}

这样可以避免将json.erb模板添加到组合中所带来的复杂性,无论是Rails Purist方法,我都说不上; 可能通常会使用RJS。

扫码关注云+社区