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?

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

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 .


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 => "info@hayesdubuque.com",
        :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 => "info@ziemannstreich.com",
        :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

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


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


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

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


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


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

5

Użyj irbtoolsklejnotu.

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


Ł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


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)

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.