如何重新格式化原始数据,然后在Rails 4中呈现嵌套的JSON请求?

时间:2016-09-20 07:25:44

标签: ruby-on-rails json

def index
  @users = User.all
  render json: @users
end

返回一个json响应(实际上我有20个不同的属性,这只是一个子集):

 {“id”:1, “name”:”John”, "city": "New York"}, 
 {“id”:2, “name”:”Dave”, "city": "Chicago"}, 
 {“id”:3, “name”:”Peter”, "city": "Beijing"}

但我希望回复更像是这样:

{“id”:1, “name”{"name”,"John”, "id":1}, "city": "New York"}, 
{“id”:2, “name”{"name”,"Dave”, "id":2}, "city": "Chicago"}, 
{“id”:3, “name”{"name”,"Peter”, "id":3}, "city": "Beijing"}

因此,当我遍历请求时,我可以访问这样的属性:

name.id         #will print 1
name.name       #will print “John”
city            #will print "New York"

2 个答案:

答案 0 :(得分:1)

只需在括号中输入:

@users = User.all
render json: @users.map{ |k| {name: {name: k.name, id: k.id}, city: k.city} }

答案 1 :(得分:0)

我是https://github.com/ruby-grape/grape-entity#example

的粉丝

一些很酷的事情是,您可以为您需要的任何字段创建不同的模型定义,并且可以嵌套这些的任何变体。 因此,对于略有不同的示例(具有嵌套地址对象的用户):

在模特中:

class User < Grape::Entity
  expose :name
end

class UserSimpleWithAddress < User
  expose :address, using: API::Entities::AddressSimple
end

class AddressSimple < Grape::Entity
  expose :zip
  expose :city
end

渲染:

UserSimpleWithAddress.represent(@users).to_json

当您的模型/需求随着时间变得更加复杂时,这非常方便。