如何在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"

有什么想法吗?

Answers:


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
因为它是内置的,可以立即使用,并且最重要的是简单,所以应将其标记为正确的答案。
机器人

15
这个答案已经过时了。请参阅: stackoverflow.com/questions/11571801/… 要进行此工作,必须首先执行YAML::ENGINE.yamler = 'syck'
jordanpg 2012年

5
它现在YAML :: ENGINE.yamler = '斗志'
jumpa

这类似于ryanb >> ProductColor.all >> y _
Deepak Lamichhane

1
就像上面的@botbot一样,这是最好的答案,因为它适用于您无法访问.irbrc,其他控制台工具或控制台的其他配置的情况(例如,作为合同开发者,对生产容器/服务器的访问受限) )
Todd

97

您应该尝试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

您可以在其主页上了解有关hirb的更多信息。


3
ryanb的答案基本上是我想要的,但这太酷了,无法接受。
汤姆·雷曼

7
尽管不是原始问题的答案,但它可能指出您可以将hirb内容添加到〜/ .irbrc中,因此您不必每次都要求并启用它。
jordelver

1
这个宝石现在已经过时了。
Amrit Dhungana 2014年

有没有一种方法可以“轻松地”对输出的列进行排序?我想强制将列ID设置为first,然后将end_at&created_at设置在末尾(如果您在第一次迁移后添加列,则updated_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是支持v1.9.3之前的Ruby版本和v3.0之前的Rails版本的最新版本。即将发布的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对象或数组
Hassan Akram

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,您只需

无需输入ap的Model.all


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

4

您可能想要定义ProductColor的inspect方法以返回您认为不错的东西。例如:

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

3

要添加到Alter Lago关于使用AwesomePrint的建议中,如果您不能/不应该/不想将awesome_print gem添加到项目的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'

(当然,请确保路径和版本正确)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.