Ruby on rails ActiveRecord集合的嵌套哈希的Rabl

Ruby on rails ActiveRecord集合的嵌套哈希的Rabl,ruby-on-rails,ruby,json,serialization,rabl,Ruby On Rails,Ruby,Json,Serialization,Rabl,我有一些ActiveRecord对象,如City、Country、State等。我的控制器操作如下(作为一个典型示例): 我想呈现一个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'}],

我有一些
ActiveRecord
对象,如
City
Country
State
等。我的控制器操作如下(作为一个典型示例):

我想呈现一个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
模板应该是什么?几个小时来,我一直在为这件事伤脑筋。

如果我是你,我甚至不想去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 
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