Як отримати приємне форматування в консолі Rails


127

Я хочу, щоб щось подібне виглядало добре:

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

Це не працює:

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

І це також не робить:

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

Думки?

Відповіді:


255

yМетод являє собою зручний спосіб отримати досить вихід YAML.

y ProductColor.all

Якщо припустити, що ви перебуваєте script/console

Як прокоментував jordanpg, ця відповідь застаріла. Для Rails 3.2+ вам потрібно виконати наступний код, перш ніж ви зможете приступити yдо роботи методу:

YAML::ENGINE.yamler = 'syck'

Від ruby-docs

У старих версіях Ruby, тобто. <= 1.9, Syck все ще надається, проте він був повністю видалений з випуском Ruby 2.0.0.

Для рейок 4 / рубін 2 ви можете використовувати просто

puts object.to_yaml

5
це має бути позначено як правильну відповідь, оскільки він вбудований, може бути використаний негайно, і, головне, простий.
ботбот

15
Ця відповідь застаріла. Дивіться: stackoverflow.com/questions/11571801/… Щоб зробити цю роботу, потрібно спочатку виконати YAML::ENGINE.yamler = 'syck'.
jordanpg

5
Його тепер YAML :: ENGINE.yamler = '
психіка

Це схоже на ryanb >> ProductColor.all >> y _
Deepak Lamichhane

1
як @botbot сказав вище, це найкраща відповідь, оскільки це стосується ситуацій, коли у вас немає доступу до .irbrcінших, консольних інструментів чи інших конфігурацій консолі (наприклад, будучи замовленим розробником з обмеженим доступом до виробничого контейнера / сервера )
Тодд

97

Спробуйте спробувати hirb . Це дорогоцінний камінь, створений для гарненького форматування об'єктів на консолі рубіна. Ваш сеанс сценарію / консолі виглядатиме так:

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

Ви можете дізнатися більше про hirb на його домашній сторінці .


3
Відповідь Райанба в основному те, що я шукав, але це занадто круто, щоб не прийняти.
Том Леман

7
Хоча це не відповідь на початкове запитання, можливо, це вказує на те, що ви можете додати hirb до свого ~ / .irbrc, щоб вам не потрібно було вимагати та вмикати його щоразу.
jordelver

1
Зараз цей дорогоцінний камінь застарів.
Амріт Дхунгана

Чи є спосіб "легко" сортувати стовпці виводу? Я хотів би змусити ідентифікатор стовпця бути першим та оновленим_at & created_at наприкінці (якщо ви додасте стовпці після першої міграції, стовпці оновленого_at & created_at не будуть наприкінці)
MrYoshiji

27

Дивовижний друк також приємний, якщо ви хочете, щоб об'єкт був з відступом. Щось на зразок:

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

Щоб інтегрувати його за замовчуванням у консоль irb / rails / pry, додайте у свій файл ~/.irbrcабо ~/.pryrcфайл:

require "awesome_print"
AwesomePrint.irb! # just in .irbrc
AwesomePrint.pry! # just in .pryrc

1
Чи можу я використовувати цей дорогоцінний камінь з Rails 4 або 5 ?? Я знайшов таку примітку на сторінці github: ПРИМІТКА: awesome_print v1.2.0 - це останній випуск, що підтримує версії Ruby до версії v.9.9.3 та Rails до версії v3.0. Майбутній awesome_print v2.0 зажадає Ruby v1.9.3 або пізнішої версії та Rails v3.0 або новішої версії. Чи означає це, що дорогоцінний камінь застарів із цими версіями і викликає конфлікти ??
ltdev


11

Можна також зазначити, що ви можете використовувати:

j ProductColor.all.inspect

для виведення у форматі Json, а не Yaml


це може вийти з ладу залежно від версії JSON / ruby, і приємне форматування може знадобитися в умовах, коли не можна мати приємні речі
Todd

3
Помилка підняття: JSON :: GeneratorError: дозволено лише покоління об'єктів або масивів JSON
Хасан Акрам

8

Привіт, ви також можете спробувати це у своєму сценарії / консолі, якщо

>> y ProductColor.all

не працює для вас.

Спробуйте це:

>> require 'yaml'

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

тоді

>> y ProductColor.all

7

У мене виникли проблеми, коли він працював, тому я додаю свої два центи до awesome_print, додаю це до вашого Gemfile, бажано в :development

gem 'awesome_print', require: 'ap'

то в

rails console

Ви можете зробити

> ap Model.all Це воно. Однак ви також можете додати

require "awesome_print"
AwesomePrint.irb!

до вашого ~ / .irbrc, цей спосіб awesome_print буде потрібен щоразу, коли ви відкриєте консоль, і ви можете просто зробити

Model.all, не потребуючи введення ap


6

Ви також можете спробувати наступне для групи об’єктів

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

Це дасть вам набагато приємніший результат, наприклад

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

Виклик to_yamlатрибутів, а не самого об'єкта, врятує вас від перегляду повного вмісту об'єкта у висновку

Або puts Object.last.attributes.to_yamlдля одного об’єкта

Доступна також стенограма: y Object.last.attributes


6

Я думаю, що це рішення є найбільш точним. Спробуйте це:

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

Це дасть вам надзвичайно приємний вихід порівняння з форматом 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

Використовуйте irbtoolsдорогоцінний камінь.

Він автоматично відформатує вихід консолі, ви отримаєте багато чудових функцій.


Приємно! Але я не можу змусити його відформатувати вміст ActiveResource ... якщо я не роблю щось не так
Crimbo

4

Ви можете визначити метод перевірки ProductColor, щоб повернути те, що вам здається приємним. Наприклад:

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

Після цього результат ProductColor.all відображатиметься як щось на зразок [<1 - Білий (білий)>, ...]. Звичайно, ви повинні пристосувати метод перевірки до своїх потреб, щоб він відображав всю необхідну інформацію у стилі, який вам подобається.

Редагувати: також якщо проблемою було відсутність розривів рядків у висновку, ви можете спробувати

require 'pp'
pp ProductColor.all

які повинні вставляти рядкові перерви, де це доречно


Насправді require 'pp'це неможливо в Росії rails console --sandbox. Чомусь я отримую, falseколи намагаюся вимагати pp. На жаль! здається, ppце вже потрібно за замовчуванням у rails console. Я щойно зробив pp Model.connection_handlerі отримав великий симпатичний друкований випуск. Дякую.
Зелений

@Green Якщо requireповертається false, це просто означає, що файл вже завантажений.
sepp2k

Чому символ inspectне відображається, коли це робиться просто ProductColor.all?
Арнольд Роа

3

Щоб додати пропозицію Alter Lago щодо використання AwesomePrint, Якщо ви не можете / не повинні / не хочете додати gemfile_print_print в Gemfile вашого проекту, зробіть це:

gem install awesome_print

Відредагуйте ~ / .irb.rc і додайте це:

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

(Звичайно, переконайтесь, що шлях та версія правильні)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.