如何在 Rails 控制台中获得良好的格式

我想把这样的东西弄漂亮点:

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

有什么想法吗?

73682 次浏览

您可能需要定义 ProductColor 的 check 方法来返回您认为不错的内容,例如:

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

之后,ProductColor.all 的结果将显示为类似于[ < 1-White (White) > ,... ]的内容。当然,您应该根据自己的需要调整查看方法,以便它以您喜欢的样式显示所有需要的信息。

编辑: 如果问题是输出中缺少换行符,您也可以尝试一下

require 'pp'
pp ProductColor.all

它应该在适当的地方插入换行符

y方法是获得一些漂亮的 YAML 输出的便捷方法。

y ProductColor.all

假设你在 script/console

正如 jordanpg 评论的那样,这个答案已经过时了。对于 Rails 3.2 + ,在使用 y方法之前,需要执行以下代码:

YAML::ENGINE.yamler = 'syck'

来自 Ruby 医生

在旧的 Ruby 版本中,例如 < = 1.9,仍然提供了 Syck,但是 随着 Ruby2.0.0的发布完全被移除了。

对于 Rails 4/ruby 2,您可以只使用

puts object.to_yaml

你应该试试 Hib。它是一个用于在 Ruby 控制台中优美格式化对象的 gem。您的脚本/控制台会话如下所示:

>> 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 的信息。

还可以注意到,你可以使用:

j ProductColor.all.inspect

输出为 Json 格式,而非 Yaml 格式

Awesome print 也很不错,如果你想缩进一个对象,比如:

$ 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/ails/pry 控制台集成,请添加到 ~/.irbrc~/.pryrc文件:

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

为了补充 Alter Lago 关于使用 AwesomePrint 的建议, 如果你不能/不应该/不想在你的项目的 Gemfile 中添加这个令人敬畏的 _ print gem,可以这样做:

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'

(当然,要确保路径和版本是正确的)

使用 irbtools宝石。

它将自动格式化控制台输出,并且您将获得大量优秀的特性。

您也可以在您的脚本/控制台中尝试这一点,如果

>> y ProductColor.all

不为你工作。

试试这个:

>> require 'yaml'


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

然后

>> y ProductColor.all
>> puts ProductColor.all.to_yaml

只是工作得很好!

资料来源: https://stackoverflow.com/a/4830096

我在使用它的时候遇到了一些麻烦,所以我要把我的两分钱加到 Awesome _ print 上 将此添加到您的 Gemfile,最好在 :development

gem 'awesome_print', require: 'ap'

然后进去

rails console

你可以的

> ap Model.all 就是这样,不过你也可以加上

require "awesome_print"
AwesomePrint.irb!

对于您的 ~/. irbrc,这样在任何时候打开控制台并简单地执行

全是模特 而不需要输入 ap

您还可以对一组对象尝试以下操作

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