So erhalten Sie eine schöne Formatierung in der Rails-Konsole

127

Ich möchte, dass so etwas schön aussieht:

>> ProductColor.all
=> [#<ProductColor id: 1, name: "White", internal_name: "White", created_at: "2009-06-10 04:02:44", updated_at: "2009-06-10 04:02:44">, #<ProductColor id: 2, name: "Ivory", internal_name: "Ivory", created_at: "2009-06-10 04:02:44", updated_at: "2009-06-10 04:02:44">, #<ProductColor id: 3, name: "Blue", internal_name: "Light Blue", created_at: "2009-06-10 04:02:44", updated_at: "2009-06-10 04:02:44">, #<ProductColor id: 4, name: "Green", internal_name: "Green", created_at: "2009-06-10 04:02:44", updated_at: "2009-06-10 04:02:44">]

Das funktioniert nicht:

>> ProductColor.all.inspect
=> "[#<ProductColor id: 1, name: \"White\", internal_name: \"White\", created_at: \"2009-06-10 04:02:44\", updated_at: \"2009-06-10 04:02:44\">, #<ProductColor id: 2, name: \"Ivory\", internal_name: \"Ivory\", created_at: \"2009-06-10 04:02:44\", updated_at: \"2009-06-10 04:02:44\">, #<ProductColor id: 3, name: \"Blue\", internal_name: \"Light Blue\", created_at: \"2009-06-10 04:02:44\", updated_at: \"2009-06-10 04:02:44\">, #<ProductColor id: 4, name: \"Green\", internal_name: \"Green\", created_at: \"2009-06-10 04:02:44\", updated_at: \"2009-06-10 04:02:44\">]"

Und das auch nicht:

>> ProductColor.all.to_yaml
=> "--- \n- !ruby/object:ProductColor \n  attributes: \n    name: White\n    created_at: 2009-06-10 04:02:44\n    updated_at: 2009-06-10 04:02:44\n    id: \"1\"\n    internal_name: White\n  attributes_cache: {}\n\n- !ruby/object:ProductColor \n  attributes: \n    name: Ivory\n    created_at: 2009-06-10 04:02:44\n    updated_at: 2009-06-10 04:02:44\n    id: \"2\"\n    internal_name: Ivory\n  attributes_cache: {}\n\n- !ruby/object:ProductColor \n  attributes: \n    name: Blue\n    created_at: 2009-06-10 04:02:44\n    updated_at: 2009-06-10 04:02:44\n    id: \"3\"\n    internal_name: Light Blue\n  attributes_cache: {}\n\n- !ruby/object:ProductColor \n  attributes: \n    name: Green\n    created_at: 2009-06-10 04:02:44\n    updated_at: 2009-06-10 04:02:44\n    id: \"4\"\n    internal_name: Green\n  attributes_cache: {}\n\n"

Gedanken?

Tom Lehman
quelle

Antworten:

255

Die yMethode ist ein praktischer Weg, um eine hübsche YAML-Ausgabe zu erhalten.

y ProductColor.all

Vorausgesetzt, Sie sind dabei script/console

Wie jordanpg kommentierte, ist diese Antwort veraltet. Für Rails 3.2+ müssen Sie den folgenden Code ausführen, bevor die yMethode funktioniert:

YAML::ENGINE.yamler = 'syck'

Aus Ruby-Docs

In älteren Ruby-Versionen, dh. <= 1.9, Syck wird weiterhin bereitgestellt, wurde jedoch mit der Veröffentlichung von Ruby 2.0.0 vollständig entfernt.

Für Schienen 4 / Rubin 2 könnte man nur verwenden

puts object.to_yaml
Ryanb
quelle
5
Dies sollte als die richtige Antwort markiert werden, da es eingebaut ist, sofort verwendet werden kann und vor allem einfach ist.
Botbot
15
Diese Antwort ist veraltet. Siehe: stackoverflow.com/questions/11571801/… Damit dies funktioniert, müssen Sie zuerst ausführen YAML::ENGINE.yamler = 'syck'.
Jordanpg
5
Es ist jetzt YAML :: ENGINE.yamler = 'psych'
jumpa
Dies ist ähnlich wie Ryanb >> ProductColor.all >> y _
Deepak Lamichhane
1
Wie oben bei @botbot erwähnt, ist dies die beste Antwort, da sie auf Situationen zutrifft, in denen Sie keinen Zugriff auf eine .irbrc, andere Konsolentools oder andere Konfigurationen der Konsole haben (z. B. als Vertragsentwickler mit eingeschränktem Zugriff auf einen Produktionscontainer / -server) )
Todd
97

Sie sollten Hirb versuchen . Es ist ein Juwel, um Objekte in der Ruby-Konsole hübsch zu formatieren. Ihre Skript- / Konsolensitzung würde folgendermaßen aussehen:

>> require 'hirb'
=> true
>> Hirb.enable
=> true
>> ProductColor.first
+----+-------+---------------+---------------------+---------------------+
| id | name  | internal_name | created_at          | updated_at          |
+----+-------+---------------+---------------------+---------------------+
| 1  | White | White         | 2009-06-10 04:02:44 | 2009-06-10 04:02:44 |
+----+-------+---------------+---------------------+---------------------+
1 row in set
=> true

Mehr über hirb erfahren Sie auf seiner Homepage .

Cldwalker
quelle
3
Ryanbs Antwort ist im Grunde das, wonach ich gesucht habe, aber das ist zu cool, um es nicht zu akzeptieren.
Tom Lehman
7
Obwohl dies keine Antwort auf die ursprüngliche Frage ist, weist es möglicherweise darauf hin, dass Sie das Hirb-Zeug zu Ihrem ~ / .irbrc hinzufügen können, damit Sie es nicht jedes Mal benötigen und aktivieren müssen.
Jordanelver
1
Dieses Juwel ist jetzt veraltet.
Amrit Dhungana
Gibt es eine Möglichkeit, die Spalten der Ausgabe "einfach" zu sortieren? Ich würde gerne erzwingen, dass die Spalten-ID zuerst und aktualisiert_at & erstellt_at am Ende ist (wenn Sie nach der ersten Migration Spalten hinzufügen, werden die Spalten aktualisiert_at & erstellt_at nicht am Ende sein)
MrYoshiji
27

Fantastischer Druck ist auch schön, wenn Sie ein Objekt eingerückt haben möchten. Etwas wie:

$ rails console
rails> require "awesome_print"
rails> ap Account.all(:limit => 2)
[
    [0] #<Account:0x1033220b8> {
                     :id => 1,
                :user_id => 5,
            :assigned_to => 7,
                   :name => "Hayes-DuBuque",
                 :access => "Public",
                :website => "http://www.hayesdubuque.com",
        :toll_free_phone => "1-800-932-6571",
                  :phone => "(111)549-5002",
                    :fax => "(349)415-2266",
             :deleted_at => nil,
             :created_at => Sat, 06 Mar 2010 09:46:10 UTC +00:00,
             :updated_at => Sat, 06 Mar 2010 16:33:10 UTC +00:00,
                  :email => "[email protected]",
        :background_info => nil
    },
    [1] #<Account:0x103321ff0> {
                     :id => 2,
                :user_id => 4,
            :assigned_to => 4,
                   :name => "Ziemann-Streich",
                 :access => "Public",
                :website => "http://www.ziemannstreich.com",
        :toll_free_phone => "1-800-871-0619",
                  :phone => "(042)056-1534",
                    :fax => "(106)017-8792",
             :deleted_at => nil,
             :created_at => Tue, 09 Feb 2010 13:32:10 UTC +00:00,
             :updated_at => Tue, 09 Feb 2010 20:05:01 UTC +00:00,
                  :email => "[email protected]",
        :background_info => nil
    }
]

Um es standardmäßig in Ihre irb / Rails / Pry-Konsole zu integrieren, fügen Sie es zu Ihrer ~/.irbrcoder ~/.pryrc-Datei hinzu:

require "awesome_print"
AwesomePrint.irb! # just in .irbrc
AwesomePrint.pry! # just in .pryrc
Alter Lagos
quelle
1
Kann ich dieses Juwel mit Rails 4 oder 5 verwenden? Ich habe den folgenden Hinweis auf der Github-Seite gefunden: HINWEIS: awesome_print v1.2.0 ist die letzte Version, die Ruby-Versionen vor v1.9.3 und Rails-Versionen vor v3.0 unterstützt. Für den kommenden awesome_print v2.0 sind Ruby v1.9.3 oder höher und Rails v3.0 oder höher erforderlich. Bedeutet dies, dass das Juwel mit diesen Versionen veraltet ist und Konflikte verursacht?
6.
12
>> puts ProductColor.all.to_yaml

Funktioniert einfach gut!

Quelle: https://stackoverflow.com/a/4830096

Rody
quelle
Das funktioniert super! Ich konnte die anderen Top-Antworten nicht zum
Laufen bringen
11

Es kann auch angemerkt werden, dass Sie Folgendes verwenden können:

j ProductColor.all.inspect

Ausgabe im Json-Format anstelle von Yaml

Davidcollom
quelle
Dies kann je nach Version von JSON / Ruby fehlschlagen, und die nette Formatierung kann in einer Umgebung erforderlich sein, in der man keine schönen Dinge haben kann
Todd
3
Dieser Auslösefehler: JSON :: GeneratorError: Nur Generierung von JSON-Objekten oder Arrays erlaubt
Hassan Akram
8

Hallo, Sie können dies auch in Ihrem Skript / Ihrer Konsole versuchen, wenn

>> y ProductColor.all

nicht für dich arbeiten.

Versuche dies:

>> require 'yaml'

>> YAML::ENGINE.yamler = 'syck'

dann

>> y ProductColor.all
AllenC
quelle
7

Ich hatte einige Probleme damit es funktioniert, also werde ich meine zwei Cent zu awesome_print hinzufügen und dies zu deiner Gemfile hinzufügen, vorzugsweise in :development

gem 'awesome_print', require: 'ap'

dann in

rails console

du kannst tun

> ap Model.all Das ist es. Sie können jedoch auch hinzufügen

require "awesome_print"
AwesomePrint.irb!

Für Ihr ~ / .irbrc ist awesome_print jedes Mal erforderlich, wenn Sie die Konsole öffnen und dies einfach tun können

Model.all ohne die Notwendigkeit, ap einzugeben

AndreiMotinga
quelle
6

Sie können auch Folgendes für eine Gruppe von Objekten versuchen

Object.all.map(&:attributes).to_yaml

Dies gibt Ihnen viel schönere Ausgabe, wie

---
id: 1
type: College
name: University of Texas
---
id: 2
type: College
name: University of California

Wenn Sie to_yamlAttribute anstelle des Objekts selbst aufrufen, können Sie nicht den gesamten Inhalt des Objekts in der Ausgabe anzeigen

Oder puts Object.last.attributes.to_yamlfür ein einzelnes Objekt

Kurzschrift ist auch verfügbar: y Object.last.attributes

Abram
quelle
6

Ich denke, diese Lösung ist die genaueste. Sie sollten dies versuchen:

puts JSON.pretty_generate Entry.all.map(&:attributes)

Dies gibt Ihnen eine super schöne Ausgabe im Vergleich zum YAML-Format:

[
  {
    "id": 44,
    "team_id": null,
    "member_id": 1000000,
    "match_id": 1,
    "created_at": "2019-04-09 15:53:14 +0900",
    "updated_at": "2019-04-09 15:53:14 +0900"
  },
  {
    "id": 45,
    "team_id": null,
    "member_id": 1000001,
    "match_id": 1,
    "created_at": "2019-04-09 15:53:36 +0900",
    "updated_at": "2019-04-09 15:53:36 +0900"
  },
  {
    "id": 46,
    "team_id": null,
    "member_id": 1000003,
    "match_id": 1,
    "created_at": "2019-04-09 15:56:40 +0900",
    "updated_at": "2019-04-09 15:56:40 +0900"
  },
  {
    "id": 47,
    "team_id": null,
    "member_id": 1000004,
    "match_id": 1,
    "created_at": "2019-04-09 15:56:48 +0900",
    "updated_at": "2019-04-09 15:56:48 +0900"
  }
]
Peter Nguyen
quelle
5

Verwenden Sie irbtoolsEdelstein.

Die Konsolenausgabe wird automatisch formatiert, und Sie erhalten unzählige großartige Funktionen.

VivekVarade123
quelle
Nett! Aber ich kann es nicht dazu bringen, ActiveResource-Inhalte zu formatieren ... es sei denn, ich mache etwas falsch
Crimbo
4

Möglicherweise möchten Sie die Inspect-Methode von ProductColor definieren, um etwas zurückzugeben, das Ihnen gefällt. Beispielsweise:

def inspect
  "<#{id} - #{name} (#{internal_name})>"
end

Danach wird das Ergebnis von ProductColor.all wie folgt angezeigt: [<1 - Weiß (Weiß)>, ...]. Natürlich sollten Sie die Inspektionsmethode an Ihre Bedürfnisse anpassen, damit alle benötigten Informationen in einem von Ihnen gewünschten Stil angezeigt werden.

Bearbeiten: Auch wenn das Problem das Fehlen von Zeilenumbrüchen in der Ausgabe war, können Sie es versuchen

require 'pp'
pp ProductColor.all

die gegebenenfalls Zeilenumbrüche einfügen sollten

sepp2k
quelle
Tatsächlich require 'pp'ist in nicht möglich rails console --sandbox. Aus irgendeinem Grund bekomme ich, falsewenn ich versuche zu verlangen pp. Hoppla! es scheint, dass dies ppbereits standardmäßig in erforderlich ist rails console. Ich habe es gerade getan pp Model.connection_handlerund eine große, hübsche Druckausgabe bekommen. Vielen Dank.
Grün
@Green Wenn requirezurückgegeben falsewird, bedeutet dies nur, dass die Datei bereits geladen wurde.
sepp2k
Warum wird das inspectgerade nicht angezeigt ProductColor.all?
Arnold Roa
3

Um den Vorschlag von Alter Lago für die Verwendung von AwesomePrint zu ergänzen, gehen Sie folgendermaßen vor, wenn Sie den Edelstein awesome_print nicht zum Gemfile Ihres Projekts hinzufügen können / sollten / wollen:

gem install awesome_print

Bearbeiten Sie ~ / .irb.rc und fügen Sie Folgendes hinzu:

$LOAD_PATH << '/Users/your-user/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/gems/1.9.1/gems/awesome_print-1.1.0/lib'

require 'awesome_print'

(Stellen Sie sicher, dass der Pfad und die Version korrekt sind.)

Excalibur
quelle