Как получить хорошее форматирование в консоли Rails - PullRequest
119 голосов
/ 04 августа 2009

Я хочу, чтобы что-то вроде этого выглядело красиво:

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

Мысли

Ответы [ 12 ]

246 голосов
/ 04 августа 2009

Метод 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. </p>

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

puts object.to_yaml
92 голосов
/ 04 августа 2009

Вы должны попробовать hirb . Это драгоценный камень, предназначенный для красивого форматирования объектов в консоли 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

Подробнее о хирбе можно узнать на домашней странице .

22 голосов
/ 01 марта 2013

Потрясающая печать тоже подойдет, если вы хотите, чтобы объект с отступом. Что-то вроде:

$ 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
10 голосов
/ 31 июля 2013
>> puts ProductColor.all.to_yaml

Просто отлично работает!

Источник: https://stackoverflow.com/a/4830096

10 голосов
/ 24 июля 2012

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

j ProductColor.all.inspect

для вывода в формате Json вместо Yaml

8 голосов
/ 06 мая 2013

Привет, вы также можете попробовать это в вашем скрипте / консоли, если

>> y ProductColor.all

не работает для вас.

Попробуйте это:

>> require 'yaml'

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

, затем

>> y ProductColor.all
6 голосов
/ 27 марта 2015

У меня были некоторые проблемы, заставляющие это работать, поэтому я добавлю свои два цента в 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

5 голосов
/ 22 апреля 2013

Используйте irbtools драгоценный камень.

Он автоматически отформатирует консольный вывод, плюс вы получите массу замечательных функций.

4 голосов
/ 04 августа 2009

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

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

После чего результат ProductColor.all будет отображаться как что-то вроде [<1 - White (White)>, ...]. Конечно, вам следует настроить метод проверки в соответствии с вашими потребностями, чтобы он отображал всю необходимую информацию в понравившемся вам стиле.

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

require 'pp'
pp ProductColor.all

который должен вставлять разрывы строк там, где это необходимо

3 голосов
/ 27 апреля 2015

Вы также можете попробовать следующее для группы объектов

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

...