J'ai un grand hachage avec des tableaux et des hachages imbriqués. Je voudrais simplement l'imprimer pour qu'il soit "lisible" par l'utilisateur.
Je voudrais que ce soit un peu comme to_yaml - c'est assez lisible - mais toujours trop technique.
En fin de compte, ce sont les utilisateurs finaux qui ont besoin de lire ces fragments de données pour pouvoir être formatés proprement.
Aucune suggestion?
require 'pp'
pp my_hash
Utilisez pp
si vous avez besoin d’une solution intégrée et souhaitez simplement des sauts de ligne raisonnables.
Utilisez awesome_print si vous pouvez installer une gemme. (En fonction de vos utilisateurs, vous pouvez utiliser l'option index:false
pour désactiver l'affichage des index de tableaux.)
Si vous avez le format JSON, je recommande JSON.pretty_generate(hash)
car il est plus simple que awesome_print , est superbe dans une balise pre
et permet une copie facile depuis une page Web. (Voir aussi: Comment puis-je "joli" formater ma sortie JSON dans Ruby on Rails? )
Une autre solution qui fonctionne mieux pour moi que pp
ou awesome_print
:
require 'pry' # must install the gem... but you ALWAYS want pry installed anyways
Pry::ColorPrinter.pp(obj)
Utilisez les réponses ci-dessus si vous imprimez aux utilisateurs.
Si vous voulez seulement l'imprimer pour vous-même dans la console, je suggère d'utiliser le joyau de levier au lieu d'irb En plus de jolies impressions, le levier présente de nombreuses autres fonctionnalités (consultez la diffusion sur rail ci-dessous).
bijou installer un levier
Et vérifiez cette diffusion sur rail:
De tous les joyaux que j'ai essayés, show_data
gem fonctionnait le mieux pour moi, je l'utilise maintenant beaucoup pour enregistrer le hachage des paramètres dans Rails pratiquement tout le temps
En utilisant Pry il vous suffit d’ajouter le code suivant à votre ~/.pryrc:
require "awesome_print"
AwesomePrint.pry!
Pour les grandes hachages imbriquées, ce script peut vous être utile. Il imprime un hachage imbriqué dans une syntaxe Nice/python avec des retraits pour faciliter la copie.
module PrettyHash
# Usage: PrettyHash.call(nested_hash)
# Prints the nested hash in the easy to look on format
# Returns the amount of all values in the nested hash
def self.call(hash, level: 0, indent: 2)
unique_values_count = 0
hash.each do |k, v|
(level * indent).times { print ' ' }
print "#{k}:"
if v.is_a?(Hash)
puts
unique_values_count += call(v, level: level + 1, indent: indent)
else
puts " #{v}"
unique_values_count += 1
end
end
unique_values_count
end
end
h = {a: { b: { c: :d }, e: :f }, g: :i }
PrettyHash.call(h)
a:
b:
c: d
e: f
g: i
=> 3
La valeur renvoyée est le nombre (3) de toutes les valeurs de niveau de fin du hachage imbriqué.
Voici une approche utilisant JSON et Rogue:
require 'json'
require 'rouge'
formatter = Rouge::Formatters::Terminal256.new
json_lexer = Rouge::Lexers::JSON.new
puts formatter.format(json_lexer.Lex(JSON.pretty_generate(JSON.parse(response))))
(analyse la réponse, par exemple, de RestClient
)
Facile à faire avec json si vous faites confiance à vos clés:
JSON.pretty_generate(a: 1, 2 => 3, 3 => nil).
gsub(": null", ": nil").
gsub(/(^\s*)"([a-zA-Z][a-zA-Z\d_]*)":/, "\\1\\2:"). # "foo": 1 -> foo: 1
gsub(/(^\s*)(".*?"):/, "\\1\\2 =>") # "123": 1 -> "123" => 1
{
a: 1,
"2" => 3,
"3" => nil
}