Ich habe einen großen Hash mit verschachtelten Arrays und Hashes. Ich möchte es einfach ausdrucken, damit es für den Benutzer "lesbar" ist.
Ich möchte, dass es wie to_yaml ist - das ist ziemlich lesbar - aber immer noch zu technisch aussehend.
Letztendlich werden es Endbenutzer sein, die diese Datenblöcke lesen müssen, damit sie sauber formatiert werden müssen.
Irgendwelche Vorschläge?
require 'pp'
pp my_hash
Verwenden Sie pp
, wenn Sie eine integrierte Lösung benötigen und nur vernünftige Zeilenumbrüche benötigen.
Verwenden Sie awesome_print , wenn Sie einen Edelstein installieren können. (Abhängig von Ihren Benutzern möchten Sie möglicherweise die Option index:false
verwenden, um die Anzeige von Array-Indizes zu deaktivieren.)
Wenn Sie JSON haben, empfehle ich JSON.pretty_generate(hash)
, weil es einfacher als awesome_print ist, in einem pre
-Tag großartig aussieht und das Kopieren von einer Webseite ermöglicht. (Siehe auch: Wie kann ich meine JSON-Ausgabe in Ruby on Rails "hübsch" formatieren? )
Eine andere Lösung, die für mich besser geeignet ist als pp
oder awesome_print
:
require 'pry' # must install the gem... but you ALWAYS want pry installed anyways
Pry::ColorPrinter.pp(obj)
Wenn Sie keine ausgefallene Juwelenaktion haben, aber über JSON verfügen, funktioniert diese CLI-Zeile mit einem Hash:
puts JSON.pretty_generate(my_hash).gsub(":", " =>")
#=>
{
:key1 => "value1",
:key2 => "value2",
:key3 => "value3"
}
Verwenden Sie die obigen Antworten, wenn Sie an Benutzer drucken.
Wenn Sie es nur für sich selbst in der Konsole ausdrucken möchten, schlage ich vor, den Edelstein statt irb zu verwenden. Neben dem hübschen Drucken bietet pry noch viele weitere Funktionen (siehe railcast unten)
edelstein installieren pry
Und check diesen Railcast:
Von allen Edelsteinen, die ich ausprobiert habe, hat show_data
gem am besten für mich gearbeitet, ich benutze es jetzt ausgiebig, um Params-Hash in Rails fast immer zu protokollieren
Mit Pry müssen Sie lediglich ~/.pryrc mit folgendem Code versehen:
require "awesome_print"
AwesomePrint.pry!
Für große verschachtelte Hashes kann dieses Skript hilfreich sein. Es druckt einen verschachtelten Hash in einer Nice-Python-ähnlichen Syntax mit nur Einzügen, um das Kopieren zu vereinfachen.
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
Der zurückgegebene Wert ist die Anzahl (3) aller Werte auf Endebene des verschachtelten Hashs.
Hier ist ein Ansatz mit Json und 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))))
(analysiert die Antwort von beispielsweise RestClient
)
Einfach mit Json zu tun, wenn Sie darauf vertrauen, dass Ihre Schlüssel gesund sind
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
}