Jak uzyskać ładne formatowanie w konsoli Railsów

129

Chcę, żeby coś takiego wyglądało ładnie:

>> 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">]

To nie działa:

>> 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\">]"

I to też nie jest:

>> 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"

Myśli?

Tom Lehman
źródło

Odpowiedzi:

256

Ta ymetoda jest wygodnym sposobem na uzyskanie ładnego wyniku YAML.

y ProductColor.all

Zakładając, że jesteś w środku script/console

Jak skomentował jordanpg, ta odpowiedź jest nieaktualna. W przypadku Railsów 3.2+ musisz wykonać następujący kod, zanim ymetoda zadziała:

YAML::ENGINE.yamler = 'syck'

Z ruby-docs

W starszych wersjach Ruby, tj. <= 1,9, Syck jest nadal dostępny, jednak został całkowicie usunięty wraz z wydaniem Ruby 2.0.0.

Do szyn 4 / ruby ​​2 możesz użyć po prostu

puts object.to_yaml
ryanb
źródło
5
to powinno być zaznaczone jako prawidłowa odpowiedź, ponieważ jest wbudowane, może być używane natychmiast, a przede wszystkim jest proste.
botbot
15
Ta odpowiedź jest nieaktualna. Zobacz: stackoverflow.com/questions/11571801/… Aby to zadziałało, musisz najpierw wykonać YAML::ENGINE.yamler = 'syck'.
jordanpg
5
Jest teraz YAML :: ENGINE.yamler = '
psych
To jest podobne do ryanb >> ProductColor.all >> y _
Deepak Lamichhane
1
jak wspomniany powyżej @botbot, jest to najlepsza odpowiedź, ponieważ dotyczy sytuacji, w których nie masz dostępu do .irbrcinnych narzędzi konsoli lub innych konfiguracji konsoli (np. bycie deweloperem zakontraktowanym z ograniczonym dostępem do kontenera / serwera produkcyjnego )
Todd
98

Powinieneś spróbować hirb . To klejnot stworzony do ładnego formatowania obiektów w rubinowej konsoli. Twoja sesja skryptu / konsoli wyglądałaby następująco:

>> 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

Możesz dowiedzieć się więcej o hirb na jego stronie głównej .

cldwalker
źródło
3
Odpowiedź ryanb jest w zasadzie tym, czego szukałem, ale jest to zbyt fajne, aby nie zaakceptować.
Tom Lehman
7
Chociaż nie jest to odpowiedź na pierwotne pytanie, może wskazywać, że możesz dodać elementy hirb do swojego ~ / .irbrc, więc nie musisz tego wymagać i włączać za każdym razem.
jordelver
1
Ten klejnot jest teraz przestarzały.
Amrit Dhungana
Czy istnieje sposób „łatwego” sortowania kolumn wyników? Chciałbym wymusić, aby identyfikator kolumny był pierwszy, a zaktualizowany_at i utworzony_at na końcu (jeśli dodasz kolumny po pierwszej migracji, kolumny updated_at i created_at nie będą na końcu)
MrYoshiji
27

Niesamowity wydruk jest również fajny, jeśli chcesz, aby obiekt był wcięty. Coś jak:

$ 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
    }
]

Aby zintegrować go domyślnie z konsolą irb / rails / pry, dodaj do swojego pliku ~/.irbrclub ~/.pryrc:

require "awesome_print"
AwesomePrint.irb! # just in .irbrc
AwesomePrint.pry! # just in .pryrc
Alter Lagos
źródło
1
Czy mogę użyć tego klejnotu z Railsami 4 lub 5? Znalazłem następującą notatkę na stronie github: UWAGA: awesome_print v1.2.0 to ostatnie wydanie obsługujące wersje Ruby przed v1.9.3 i wersje Rails przed v3.0. Nadchodzący awesome_print v2.0 będzie wymagał Ruby v1.9.3 lub nowszej i Rails v3.0 lub nowszej. Czy to oznacza, że ​​klejnot jest przestarzały w tych wersjach i powoduje konflikty?
ltdev
12
>> puts ProductColor.all.to_yaml

Po prostu działa dobrze!

Źródło: https://stackoverflow.com/a/4830096

Rody
źródło
To działa świetnie! Nie udało mi się uzyskać odpowiedzi na inne najczęściej głosowane odpowiedzi ... Myślę, że używam ActiveResource (zasoby API)
Crimbo
10

Można również zauważyć, że możesz użyć:

j ProductColor.all.inspect

do wyjścia w formacie Json, a nie Yaml

davidcollom
źródło
może się to nie udać w zależności od wersji JSON / ruby, a ładne formatowanie może być potrzebne w środowisku, w którym nie można mieć fajnych rzeczy
Todd
3
Ten podnosi błąd: JSON :: GeneratorError: dozwolone jest tylko generowanie obiektów lub tablic JSON
Hassan Akram
8

Cześć, możesz też spróbować tego w swoim skrypcie / konsoli, jeśli

>> y ProductColor.all

nie działa dla ciebie.

Spróbuj tego:

>> require 'yaml'

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

następnie

>> y ProductColor.all
AllenC
źródło
7

Miałem kłopoty, aby to działało, więc dodam moje dwa centy do awesome_print dodaj to do twojego Gemfile, najlepiej w :development

gem 'awesome_print', require: 'ap'

potem w

rails console

możesz to zrobić

> ap Model.all Otóż ​​to. Możesz jednak dodać

require "awesome_print"
AwesomePrint.irb!

do twojego ~ / .irbrc, w ten sposób awesome_print będzie wymagany za każdym razem, gdy otworzysz konsolę i możesz po prostu zrobić

Model. Wszystko bez konieczności wpisywania ap

AndreiMotinga
źródło
6

Możesz również wypróbować poniższe dla grupy obiektów

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

To da o wiele ładniejszy wynik, na przykład

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

Powołanie to_yaml atrybutów, a nie samego obiektu, zapobiega wyświetlaniu pełnej zawartości obiektu w danych wyjściowych

Albo puts Object.last.attributes.to_yamldla pojedynczego obiektu

Dostępna jest również wersja skrócona: y Object.last.attributes

Abram
źródło
6

Myślę, że to rozwiązanie jest najbardziej trafne. Powinieneś spróbować tego:

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

To da ci super ładne wyjście w porównaniu do formatu YAML:

[
  {
    "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
źródło
5

Użyj irbtoolsklejnotu.

Automatycznie sformatuje dane wyjściowe konsoli, a ponadto otrzymasz mnóstwo wspaniałych funkcji.

VivekVarade123
źródło
Ładny! Ale nie mogę go zmusić do sformatowania zawartości ActiveResource ... chyba że robię coś źle
Crimbo
4

Możesz chcieć zdefiniować metodę inspect ProductColor, aby zwrócić coś, co uważasz za fajne. Na przykład:

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

Następnie wynik ProductColor.all zostanie wyświetlony jako coś w rodzaju [<1 - White (White)>, ...]. Oczywiście powinieneś dostosować metodę inspekcji do swoich potrzeb, aby wyświetlała wszystkie potrzebne informacje w stylu, który lubisz.

Edycja: również jeśli problemem był brak podziałów wierszy na wyjściu, możesz spróbować

require 'pp'
pp ProductColor.all

które powinny wstawiać podziały wierszy tam, gdzie to stosowne

sepp2k
źródło
W rzeczywistości require 'pp'nie jest to możliwe w rails console --sandbox. Z jakiegoś powodu dostaję, falsekiedy próbuję wymagać pp. Ups! wydaje się, że ppjest to już wymagane domyślnie w rails console. Właśnie to zrobiłem pp Model.connection_handleri otrzymałem duży, ładny wydruk. Dzięki.
Green
@Zielony Jeśli requirezwraca false, oznacza to po prostu, że plik został już załadowany.
sepp2k
Dlaczego inspectnie wyświetla się, gdy robisz tylko ProductColor.all?
Arnold Roa
3

Aby dodać do sugestii Alter Lago dotyczącej używania AwesomePrint, jeśli nie możesz / nie powinieneś / nie chcesz dodać klejnotu awesome_print do pliku Gemfile twojego projektu, zrób to:

gem install awesome_print

Edytuj ~ / .irb.rc i dodaj to:

$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'

(Oczywiście upewniając się, że ścieżka i wersja są poprawne)

Excalibur
źródło