Rails 关于 jbuilder render 出来字符串,不能 render 出 json 对象

tiseheaini · 2014年05月07日 · 最后由 tiseheaini 回复于 2014年05月10日 · 4389 次阅读

没有改动之前的代码 controller

def article_sort
  shares = Share.order("id desc").limit(300)
  @shares = shares.sort{|a,b| b.liked.size <=> a.liked.size }
  render :tag
end

tag.json.jbuilder

json.array! @shares do |share|
  json.extract! share, :id, :content, :category_id
  json.set! :status, true
  json.set! :created_at, share.created_at.strftime("%Y/%m/%d at %H:%M %P")
  json.set! :username, share.user.username
  json.set! :comments_size, share.comments.size
  json.set! :like_count, share.liked.size
  json.set! :deserve_count, share.deserved.size
end

正常使用没有出现问题 后来因为需求变动,需要添加一个新的 json 字段 shares_pageaction (一个分页 HTML 代码片段)

def article_sort
  shares = Share.order("id desc").limit(300)
  @shares = shares.sort{|a,b| b.liked.size <=> a.liked.size }
  articles_json = render( template: 'shares/tag.json.jbuilder', locals: { users: @shares})
  shares_pageaction = render_to_string(:partial => "shares/article_paging")
  render :json => { :articles => articles_json, :shares_pageaction => shares_pageaction }
end

tag.json.jbuilder 文件没有变,想要复用这部分代码 问题出在 render tag.json.jbuilder 出来的是 字符串 而不是 json 对象 是不是 render 方法没有用对,需要用到其他方法才能正确 render 出 json 对象。

route format

#1 楼 @i5ting

articles_json = render( template: 'shares/tag.json.jbuilder', locals: { users: @shares}, :formats => :json)

我这样试过,不过还是不生效,我在怀疑是不是 render 没办法渲染出来 json 对象

#1 楼 @i5ting 目前还没有找到合适的办法 render json 对象

def article_sort
  shares = Share.order("id desc").limit(300)
  @shares = shares.sort{|a,b| b.liked.size <=> a.liked.size }
  ## 将要render 的 json 先转化成 String ,然后在 JSON.parse( data.articles_json ) 成 json 对象
  articles_json = render_to_string( :tag )
  shares_pageaction = render_to_string(:partial => "shares/article_paging")
  render :json => { :articles => articles_json, :shares_pageaction => shares_pageaction }
end

将要 render 的 json 先转化成 String ,然后在 JSON.parse( data.articles_json ) 成 json 对象 虽然麻烦了点,不过复用了一部分代码,还是比较丑陋的解决掉了。

重点是 response 头里面的 context-type

#1 楼 @i5ting #4 楼 @huacnlee context-type 是 json,请求回来的也是一个 json 它返回的是这样的

{
  articles: "字符串",
  shares_pagacito: "字符串"
}

不过我希望 articles 键下面也是一个 json 对象,而不是字符串(貌似 articles 下面是一个数组,数组不是 hash 格式,所以默认转化成了字符串,菜鸟的猜测)

{
  articles: json 对象,
  shares_pagacito: "字符串"
}

render 出来字符串不是很正常吗?render 返回的本来就是字符串。 只是这字符串在传送给前端浏览器的时候,由于有了 content-type 头,所以浏览器对它 JSON.parse 而已啊。 为什么不直接在返回给前端前,在 ruby 这里做个 json.parse?

#6 楼 @alsotang 谢谢你的提醒,刚才我试了一下,确实没问题了。 我记得开始的时候我有这样尝试,发现会出问题,可能是那时脑子有点累了有点不清醒了。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号