2010-02-10 29 views
2

我无法使用国家/地区代码:{“AF”=>“阿富汗”,“AL”=>“阿尔巴尼亚”,“DZ”)在国家名称的哈希数据结构中呈现ruby中的json响应。 =>“阿尔及利亚”,...},以便json响应按照字母顺序排列如下:我怎样才能渲染一个哈希json响应,同时维护轨道上的红宝石顺序?

{“AF”:“Afghanistan”,“AL”:“Albania”,“DZ”=> “Algeria”...}

这个问题,我的理解是,一个红宝石散列本身没有秩序的概念。所以反应是完全随机的。

感谢您的任何帮助!

马丁

+0

Ruby 1.9已经订购了哈希。 – guns 2010-02-10 04:44:57

回答

0

如何散列像一个数组:

[{ "AF"=>"Afghanistan"}, {"AL"=>"Albania"}, {"DZ"=>"Algeria"}, ... ] 
+0

如果HTTP响应需要使用特定的格式,这将不起作用。 – 2010-02-10 03:15:43

4

您可以使用ActiveSupport::OrderedHash

样本案例:

hash = ActiveSupport::OrderedHash.new 
hash["one"] = "one" 
hash["two"] = "two" 
hash["three"] = "three" 
p hash   # Will give you the hash in reverse order 
p hash.to_json # Will give you a json with the ordered hash 
+0

嗨westoque!这正是我正在寻找的。 – mtin79 2010-02-10 04:33:08

0

得益于以前的答案( - > westoque )我结束了猴子修补程序的哈希类的轨道初始化文件夹像临屋区t:

class Hash 
def to_inverted_ordered_hash 
    copy = self.dup.invert.sort 
    copy.inject(ActiveSupport::OrderedHash.new) {|hash, i| hash[i[1]] = i[0]; hash} 
end 

def to_ordered_hash 
    copy = self.dup.sort 
    copy.inject(ActiveSupport::OrderedHash.new) {|hash, i| hash[i[1]] = i[0]; hash} 
end 
end 

并且当从控制器呈现时调用to_json。 非常感谢!

相关问题