How to get nice formatting in the Rails console

Ruby on-RailsIrb

Ruby on-Rails Problem Overview


I want to get something like this to look nice:

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

This doesn't work:

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

And neither does this:

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

Thoughts?

Ruby on-Rails Solutions


Solution 1 - Ruby on-Rails

The y method is a handy way to get some pretty YAML output.

y ProductColor.all

Assuming you are in script/console

As jordanpg commented, this answer is outdated. For Rails 3.2+ you need to execute the following code before you can get the y method to work:

YAML::ENGINE.yamler = 'syck'

From ruby-docs

> In older Ruby versions, ie. <= 1.9, Syck is still provided, however it > was completely removed with the release of Ruby 2.0.0.

For rails 4/ruby 2 you could use just

puts object.to_yaml

Solution 2 - Ruby on-Rails

You should try hirb. It's a gem made to to pretty format objects in the ruby console. Your script/console session would look like this:

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

You can learn more about hirb at its homepage.

Solution 3 - Ruby on-Rails

Awesome print is nice too if you want an object indented. Something like:

$ 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 => "[email protected]",
        :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 => "[email protected]",
        :background_info => nil
    }
]

To integrate it by default with your irb/rails/pry console, add to your ~/.irbrc or ~/.pryrc file:

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

Solution 4 - Ruby on-Rails

>> puts ProductColor.all.to_yaml

Simply works fine!

Source: https://stackoverflow.com/a/4830096

Solution 5 - Ruby on-Rails

May also be noted that you can use:

j ProductColor.all.inspect

to output in Json format rather than Yaml

Solution 6 - Ruby on-Rails

I think this solution is the most accurate one. You should try this:

puts JSON.pretty_generate Entry.all.map(&:attributes)

This will give you a super nice output compare to YAML format:

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

Solution 7 - Ruby on-Rails

Hi you can also try this in your script/console if

>> y ProductColor.all

not working for you.

Try this:

>> require 'yaml'

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

then

>> y ProductColor.all

Solution 8 - Ruby on-Rails

I had some troubles making it work so I'll add my two cents to awesome_print add this to your Gemfile, preferably in :development

gem 'awesome_print', require: 'ap'

then in

rails console

you can do

> ap Model.all That's it. However you can also add

require "awesome_print"
AwesomePrint.irb!

to your ~/.irbrc, this way awesome_print will be required anytime you open the console and you can simply do

Model.all without the need of typing ap

Solution 9 - Ruby on-Rails

You may also try the following for a group of objects

Object.all.map(&:attributes).to_yaml

This will give you much nicer output, like

---
id: 1
type: College
name: University of Texas
---
id: 2
type: College
name: University of California

Calling to_yaml on attributes rather than the object itself saves you from viewing the full contents of the object in the output

Or puts Object.last.attributes.to_yaml for a single object

Shorthand is also available: y Object.last.attributes

Solution 10 - Ruby on-Rails

Use irbtools gem.

It will automatically format the the console output plus you'll get tons of great features.

Solution 11 - Ruby on-Rails

You might want to define ProductColor's inspect method to return something that you find nice. For example:

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

After which the result of ProductColor.all will display as something like [<1 - White (White)>, ...]. Of course you should adjust the inspect method to your needs, so that it displays all the information you need in a style that you like.

Edit: also if the issue was the lack of line breaks in the output, you might try

require 'pp'
pp ProductColor.all

which should insert linebreaks where appropriate

Solution 12 - Ruby on-Rails

To add to Alter Lago's suggestion for using AwesomePrint, If you can't/shouldn't/don't want to add the awesome_print gem to your project's Gemfile, do this:

gem install awesome_print

Edit ~/.irb.rc and add this:

$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'

(Making sure the path and version are correct, of course)

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionTom LehmanView Question on Stackoverflow
Solution 1 - Ruby on-RailsryanbView Answer on Stackoverflow
Solution 2 - Ruby on-RailscldwalkerView Answer on Stackoverflow
Solution 3 - Ruby on-RailsAlter LagosView Answer on Stackoverflow
Solution 4 - Ruby on-RailsRodyView Answer on Stackoverflow
Solution 5 - Ruby on-RailsdavidcollomView Answer on Stackoverflow
Solution 6 - Ruby on-RailsPeter NguyenView Answer on Stackoverflow
Solution 7 - Ruby on-RailsAllenCView Answer on Stackoverflow
Solution 8 - Ruby on-RailsAndreiMotingaView Answer on Stackoverflow
Solution 9 - Ruby on-RailsAbramView Answer on Stackoverflow
Solution 10 - Ruby on-RailsVivekVarade123View Answer on Stackoverflow
Solution 11 - Ruby on-Railssepp2kView Answer on Stackoverflow
Solution 12 - Ruby on-RailsExcaliburView Answer on Stackoverflow