Как получить хорошее форматирование в консоли Rails
-
22-07-2019 - |
Вопрос
Я хочу получить что-то подобное, чтобы это выглядело красиво:
>> 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"
Мысли?
Решение
В y
метод - это удобный способ получить симпатичный результат YAML.
y ProductColor.all
Предполагая, что вы находитесь в script/console
Как прокомментировал jordanpg, этот ответ устарел.Для Rails 3.2+ вам необходимо выполнить следующий код, прежде чем вы сможете получить y
метод работы:
YAML::ENGINE.yamler = 'syck'
В более старых версиях Ruby, ie.<= 1.9, Syck по-прежнему предоставляется, однако он был полностью удален с выпуском Ruby 2.0.0.
Для rails 4 / ruby 2 вы могли бы использовать просто
puts object.to_yaml
Другие советы
Ты должен попробовать хирб.Это драгоценный камень, созданный для красивого форматирования объектов в консоли ruby.Ваш сеанс script / console будет выглядеть следующим образом:
>> 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 на его Домашняя страница.
Потрясающий принт это тоже неплохо, если вы хотите, чтобы объект имел отступ.Что - то вроде:
$ 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
Также можно отметить, что вы можете использовать:
j ProductColor.all.inspect
выводить в формате Json, а не Yaml
>> puts ProductColor.all.to_yaml
Просто отлично работает!
Источник: https://stackoverflow.com/a/4830096
Привет, вы также можете попробовать это в своем скрипте / консоли, если
>> y ProductColor.all
не работаю на тебя.
Попробуй это:
>> require 'yaml'
>> YAML::ENGINE.yamler = 'syck'
тогда
>> y ProductColor.all
У меня возникли некоторые проблемы с тем, чтобы это заработало, поэтому я добавлю свои два цента в awesome_print
добавьте это в свой Gemfile, предпочтительно в :development
gem 'awesome_print', require: 'ap'
затем в
rails console
вы можете сделать
> ap Model.all
Вот и все.Однако вы также можете добавить
require "awesome_print"
AwesomePrint.irb!
к вашему ~/.irbrc, таким образом, awesome_print будет требоваться всякий раз, когда вы открываете консоль, и вы можете просто сделать
Модель.все без необходимости ввода ap
Использование irbtools
драгоценный камень.
Это автоматически отформатирует вывод на консоль, плюс вы получите массу отличных функций.
Возможно, вы захотите определить метод проверки ProductColor, чтобы возвращать то, что вам нравится.Например:
def inspect
"<#{id} - #{name} (#{internal_name})>"
end
После чего результат ProductColor.все будет отображаться примерно так [<1 - Белый (White)>, ...].Конечно, вы должны настроить метод проверки в соответствии с вашими потребностями, чтобы он отображал всю необходимую вам информацию в стиле, который вам нравится.
Редактировать:также, если проблема заключалась в отсутствии разрывов строк в выходных данных, вы могли бы попробовать
require 'pp'
pp ProductColor.all
который должен вставлять разрывы строк там, где это уместно
Чтобы добавить к предложению 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'
(Разумеется, убедившись, что путь и версия указаны правильно)
Вы также можете попробовать следующее для группы объектов
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
Я думаю, что это решение является наиболее точным.Вы должны попробовать это:
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"
}
]