Rabl用于ActiveRecord集合的嵌套哈希

时间:2013-06-13 02:06:50

标签: ruby-on-rails ruby json serialization rabl

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

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模板应该是什么?我一直在打破这个问题几个小时。

1 个答案:

答案 0 :(得分: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