web-dev-qa-db-fra.com

Comment obtenir un formatage agréable dans la console Rails

Je veux que quelque chose comme ça ressemble à 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">]

Cela ne fonctionne pas:

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

Et cela non plus:

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

Pensées?

119
Tom Lehman

La méthode y est un moyen pratique d'obtenir une jolie sortie YAML.

y ProductColor.all

En supposant que vous êtes dans script/console

Comme l'a commenté jordanpg, cette réponse est obsolète. Pour Rails 3.2+, vous devez exécuter le code suivant avant de pouvoir utiliser la méthode y:

YAML::ENGINE.yamler = 'syck'

De Ruby-docs

Dans les anciennes versions Ruby, c'est-à-dire <= 1.9, Syck est toujours fourni, mais il a été complètement supprimé avec la sortie de Ruby 2.0.0.

Pour Rails 4/Ruby 2, vous pouvez utiliser simplement

puts object.to_yaml
246
ryanb

Vous devriez essayer hirb . C'est un joyau conçu pour formater de jolis objets dans la console Ruby. Votre session de script/console ressemblerait à ceci:

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

Vous pouvez en savoir plus sur hirb sur son page d'accueil .

94
cldwalker

Impression géniale est bien aussi si vous voulez un objet en retrait. Quelque chose comme:

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

Pour l'intégrer par défaut à votre console irb/Rails/pry, ajoutez à votre ~/.irbrc ou ~/.pryrc fichier:

require "awesome_print"
AwesomePrint.irb! # just in .irbrc
AwesomePrint.pry! # just in .pryrc
22
Alter Lagos
>> puts ProductColor.all.to_yaml

Fonctionne tout simplement bien!

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

10
Rody

On peut également noter que vous pouvez utiliser:

j ProductColor.all.inspect

pour produire au format Json plutôt que Yaml

10
davidcollom

Salut, vous pouvez également essayer ceci dans votre script/console si

>> y ProductColor.all

ne fonctionne pas pour vous.

Essayez ceci:

>> require 'yaml'

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

alors

>> y ProductColor.all
8
Allen Chun

J'ai eu quelques problèmes pour le faire fonctionner, alors je vais ajouter mes deux cents à awesome_print, ajoutez ceci à votre Gemfile, de préférence dans :development

gem 'awesome_print', require: 'ap'

puis dans

Rails console

tu peux faire

> ap Model.all C'est ça. Cependant, vous pouvez également ajouter

require "awesome_print"
AwesomePrint.irb!

à votre ~/.irbrc, de cette façon, awesome_print sera requis à chaque fois que vous ouvrez la console et vous pouvez simplement faire

Model.all sans avoir besoin de taper ap

6
AndreiMotinga

Utilisez irbtools gem.

Il formatera automatiquement la sortie de la console et vous obtiendrez des tonnes de fonctionnalités intéressantes.

5
VivekVarade123

Vous souhaiterez peut-être définir la méthode d'inspection de ProductColor pour renvoyer quelque chose que vous trouverez agréable. Par exemple:

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

Après quoi le résultat de ProductColor.all s'affichera comme quelque chose comme [<1 - Blanc (Blanc)>, ...]. Bien sûr, vous devez ajuster la méthode d'inspection à vos besoins, afin qu'elle affiche toutes les informations dont vous avez besoin dans un style que vous aimez.

Edit: aussi si le problème était le manque de sauts de ligne dans la sortie, vous pourriez essayer

require 'pp'
pp ProductColor.all

qui devrait insérer des sauts de ligne le cas échéant

4
sepp2k

Pour ajouter à la suggestion d'Alter Lago d'utiliser AwesomePrint, si vous ne pouvez/ne devez pas/ne voulez pas ajouter la gemme awesome_print au Gemfile de votre projet, procédez comme suit:

gem install awesome_print

Modifiez ~/.irb.rc et ajoutez ceci:

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

(S'assurer que le chemin et la version sont corrects, bien sûr)

3
Excalibur

Vous pouvez également essayer ce qui suit pour un groupe d'objets

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

Cela vous donnera une sortie beaucoup plus agréable , comme

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

Appeler to_yaml sur les attributs plutôt que sur l'objet lui-même vous évite de voir le contenu complet de l'objet dans la sortie

Ou puts Object.last.attributes.to_yaml pour un seul objet

La sténographie est également disponible: y Object.last.attributes

3
Abram

Je pense que cette solution est la plus précise. Vous devriez essayer ceci:

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

Cela vous donnera une sortie super sympa par rapport au format 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"
  }
]
1
Peter Nguyen