首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Rails3中,如何在JSON响应中呈现HTML?

在Rails3中,如何在JSON响应中呈现HTML?
EN

Stack Overflow用户
提问于 2010-03-17 11:45:47
回答 3查看 24.2K关注 0票数 17

我正在将一个应用程序从Merb 1.1 / 1.8.7移植到Rails3 (beta) / 1.9.1,它在用户记录上使用包含HTML片段的JSON响应,例如,指定更新的JSON容器,更新后的用户行如下所示。在Merb中,因为控制器方法返回的任何内容都被提供给客户端,所以可以组合一个哈希,将呈现的部分分配给其中一个键,然后返回hash.to_json (尽管这肯定不是最好的方法)。在Rails中,似乎要将数据返回给客户端,必须使用render,而render只能调用一次,因此由于部分呈现,将散列呈现为json将不起作用。

通过仔细阅读,似乎可以将数据放入JSON .erb视图文件中,使用<%=呈现部分%>,然后呈现该文件。除此之外,有没有Rails解决这个问题的方法(返回包含一个或多个HTML片段的JSON )?

在Merb中:

控制器:

代码语言:javascript
复制
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中:

控制器:

代码语言:javascript
复制
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

代码语言:javascript
复制
{
  "action": <%= raw action.to_json %>,
  "type": <%= raw type.to_json %>,
  "id": <%= raw id.to_json %>,
  "html": <%= raw render(partial: partial, locals: locals).to_json %>
}
EN

回答 3

Stack Overflow用户

发布于 2010-03-20 03:34:37

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

代码语言:javascript
复制
render json: {
  'action' => 'update',
    'type' => 'user',
      'id' => @user.id,
    'html' => render_to_string(partial: 'user_row.html.erb', locals: { user: @user })
}

这避免了在混合中添加一层json.erb模板所带来的相当大的复杂性,无论它是不是Rails纯粹主义方法,我都不能说;可能通常会使用RJS。

票数 27
EN

Stack Overflow用户

发布于 2011-04-07 05:16:36

还有一个问题有更多针对json.erb文件的解决方案。请参阅json erb template cannot find other html partial

票数 3
EN

Stack Overflow用户

发布于 2010-03-17 12:10:43

代码语言:javascript
复制
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
票数 -12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2459787

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档