2010-02-10 8 views
2

Je n'arrive pas à rendre une réponse json dans ruby ​​on rails à partir d'une structure de hachage de noms de pays avec leurs codes pays: {"AF" => "Afghanistan", "AL" => "Albanie", "DZ" => "Algérie", ...}, de sorte que la réponse de json a ses entrées classées par ordre alphabétique comme ceci:Comment puis-je rendre une réponse json à partir d'un hachage tout en maintenant l'ordre dans ruby ​​sur les rails?

{"AF": "Afghanistan", "AL": "Albanie", "DZ" => "Algérie" ...}

le problème, à mon sens, c'est qu'un hachis rubis n'a en soi aucune notion d'ordre. donc la réponse est totalement aléatoire.

merci pour toute aide!

martin

+0

Ruby 1.9 a commandé des hachages. – guns

Répondre

0

Que diriez-vous d'un tableau de hachages comme:

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

Cela ne fonctionnera pas si la réponse HTTP doit être dans ce format spécifique. –

4

Vous pouvez utiliser ActiveSupport::OrderedHash

Case Exemple:

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

Hey westoque! C'était exactement ce que je cherchais. – mtin79

0

grâce aux réponses précédentes (-> de westoque) je me suis retrouvé à singe patcher la classe de hachage dans le dossier des initialiseurs de rails comme tha 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 

et appelé to_json lorsqu'il est rendu à partir du contrôleur. Merci beaucoup!