0

我有一些ActiveRecord对象,例如,City等。我的控制器操作就像(作为一个代表性示例):CountryState

def get_data
  @data = {
    cities: City.limit(2),
    countries: Country.limit(2),
    states: State.limit(2),
    version: 1000
  }

  respond_with @data
end

我想渲染一个像这样的 JSON:

{
  data: {
    country: [{id: 1, name: 'a'}, {id: 2, name: 'b'}],
    state: [{id: 1, name: 'p'}, {id: 2, name: 'q'}],
    city: [{id: 1, name: 'x'}, {id: 2, name: 'y'}],
    version: 1000
  }
}

(请注意集合的单数键,请不要建议更改 JSON 结构,因为它是固定的。)

这应该是什么rabl模板?我已经为此烦恼了好几个小时。

4

1 回答 1

0

如果我是你,我什至不会在意为此使用 rabl 模板,因为你正在使用以下代码创建:

@data = {
    cities: City.limit(2),
    countries: Country.limit(2),
    states: State.limit(2),
    version: 1000
}   

是最终输出,而不是单个组件。

您可以将其替换为:

render :json =>  { 
 :data => {
   cities: City.limit(2).map{ |c|{:id => c[:id] },
   countries: Country.limit(2).map{ |c|{:id => c[:id] },
   states: State.limit(2).map{ |c|{:id => c[:id] },
   version: 1000
   }
 }   

它不是 rabl 的最佳用例,但如果您仍然希望它通过 rabl 加载,下面 get_data.json.rabl 中的代码就可以了。

node :data do
 {
   :version_number => @data[:version_number],
   :country =>  @data[:countries].map{ |c|{:id => c[:id] , :name => c[:name]} }
   :state =>  @data[:states].map{ |s|{:id => s[:id] , :name => s[:name]} }
   :city =>  @data[:city].map{ |c|{:id => c[:id] , :name => c[:name]} }
 }
end 
于 2013-07-22T13:32:12.283 回答