Как добиться хорошего форматирования в консоли 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.

Для rails 4 / ruby ​​2 можно использовать только

puts object.to_yaml

5
это следует отметить как правильный ответ, поскольку он встроен, может быть использован немедленно и, самое главное, прост.
бот-бот 03

15
Этот ответ устарел. См .: stackoverflow.com/questions/11571801/… Чтобы это сработало, сначала нужно выполнить YAML::ENGINE.yamler = 'syck'.
jordanpg 02

5
Теперь это YAML :: ENGINE.yamler = 'psycho'
jumpa

Это похоже на ryanb >> ProductColor.all >> y _
Deepak Lamichhane

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

97

Тебе стоит попробовать хирб . Это жемчужина, предназначенная для красивого форматирования объектов в консоли Ruby. Ваш сеанс скрипта / консоли будет выглядеть так:

>> 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
Ответ ryanb - это в основном то, что я искал, но это слишком круто, чтобы не принять его.
Tom Lehman

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

1
Этот самоцвет уже устарел.
Амрит Дунгана

Есть ли способ «легко» отсортировать столбцы вывода? Я бы хотел, чтобы идентификатор столбца был первым, а update_at и created_at в конце (если вы добавите столбцы после первой миграции, столбцы updated_at и created_at не будут в конце)
MrYoshiji 01

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 до v1.9.3 и версии Rails до v3.0. Для грядущей awesome_print v2.0 потребуется Ruby v1.9.3 или новее и Rails v3.0 или новее. Означает ли это, что гем устарел с этими версиями и вызывает конфликты ??
ltdev 06


11

Также можно отметить, что вы можете использовать:

j ProductColor.all.inspect

выводить в формате Json, а не Yaml


это может потерпеть неудачу в зависимости от версии JSON / ruby, и хорошее форматирование может потребоваться в среде, где не может быть хороших вещей
Тодд

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 - White (White)>, ...]. Конечно, вам следует настроить метод проверки в соответствии с вашими потребностями, чтобы он отображал всю необходимую информацию в удобном для вас стиле.

Изменить: также, если проблема заключалась в отсутствии разрывов строк в выводе, вы можете попробовать

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, если вы не можете / не должны / не хотите добавлять драгоценный камень awesome_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.