Comment obtenir un bon formatage dans la console Rails


127

Je veux que quelque chose comme ça soit beau:

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

Réponses:


255

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

y ProductColor.all

En supposant que vous êtes script/console

Comme jordanpg l'a commenté, cette réponse est dépassée. Pour Rails 3.2+, vous devez exécuter le code suivant avant de pouvoir faire fonctionner la yméthode:

YAML::ENGINE.yamler = 'syck'

De ruby-docs

Dans les anciennes versions de 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 les rails 4 / ruby ​​2, vous pouvez utiliser uniquement

puts object.to_yaml

5
cela devrait être marqué comme la bonne réponse car il est intégré, peut être utilisé immédiatement, et surtout, simple.
botbot

15
Cette réponse est dépassée. Voir: stackoverflow.com/questions/11571801/... Pour que cela fonctionne, vous devez d'abord exécuter YAML::ENGINE.yamler = 'syck'.
jordanpg

5
C'est maintenant YAML :: ENGINE.yamler = 'psych'
jumpa

Ceci est similaire à ryanb >> ProductColor.all >> y _
Deepak Lamichhane

1
comme @botbot l'a dit ci-dessus, c'est la meilleure réponse car elle s'applique aux situations dans lesquelles vous n'avez pas accès à un .irbrc, à d'autres outils de la console ou à d'autres configurations de la console (comme, être un développeur sous contrat avec un accès limité à un conteneur / serveur de production )
Todd le

97

Vous devriez essayer hirb . C'est un bijou fait pour mettre en forme 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 sa page d'accueil .


3
La réponse de ryanb est essentiellement ce que je recherchais, mais c'est trop cool pour ne pas l'accepter.
Tom Lehman

7
Bien que ce ne soit pas une réponse à la question d'origine, cela pourrait indiquer que vous pouvez ajouter les éléments hirb à votre ~ / .irbrc afin de ne pas avoir à l'exiger et à l'activer à chaque fois.
jordelver

1
Ce joyau est désormais dépassé.
Amrit Dhungana

Existe-t-il un moyen de trier "facilement" les colonnes de la sortie? J'adorerais forcer l'ID de colonne à être le premier et mis à jour_at & created_at à la fin (si vous ajoutez des colonnes après la première migration, les colonnes updated_at & created_at ne seront pas à la fin)
MrYoshiji

27

L'impression impressionnante est également agréable 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 => "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
    }
]

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

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

1
Puis-je utiliser ce bijou avec les rails 4 ou 5 ?? J'ai trouvé la note suivante dans la page github: REMARQUE: awesome_print v1.2.0 est la dernière version prenant en charge les versions Ruby antérieures à la v1.9.3 et les versions Rails antérieures à la v3.0. Le prochain awesome_print v2.0 nécessitera Ruby v1.9.3 ou version ultérieure et Rails v3.0 ou version ultérieure. Cela signifie-t-il que la gemme est obsolète avec ces versions et provoque des conflits ??
ltdev

12
>> puts ProductColor.all.to_yaml

Fonctionne simplement bien!

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


Cela fonctionne très bien! Je n'ai pas pu faire fonctionner les autres réponses les plus votées ... Je suppose que j'utilise ActiveResource (ressources API)
Crimbo

11

On peut également noter que vous pouvez utiliser:

j ProductColor.all.inspect

pour sortir au format Json plutôt que Yaml


cela peut échouer selon la version de JSON / ruby, et le bon formatage peut être nécessaire dans un environnement où l'on ne peut pas avoir de bonnes choses
Todd

3
Cette erreur de montée: JSON :: GeneratorError: seule génération d'objets ou de tableaux JSON autorisés
Hassan Akram

8

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

>> y ProductColor.all

ne fonctionne pas pour vous.

Essaye ça:

>> require 'yaml'

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

puis

>> y ProductColor.all

7

J'ai eu du mal à le faire fonctionner alors je vais ajouter mes deux cents à awesome_print et ajouter 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 tout. 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

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

Appel to_yaml d'attributs plutôt que de l'objet lui-même vous évite d'afficher le contenu complet de l'objet dans la sortie

Ou puts Object.last.attributes.to_yamlpour un seul objet

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


6

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

5

Utilisez des irbtoolsgemmes.

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


Agréable! Mais je ne peux pas le faire pour formater le contenu ActiveResource ... sauf si je fais quelque chose de mal
Crimbo

4

Vous voudrez peut-être définir la méthode d'inspection de ProductColor pour renvoyer quelque chose que vous trouvez 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 - White (White)>, ...]. Bien sûr, vous devez adapter 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: également si le problème était le manque de sauts de ligne dans la sortie, vous pouvez essayer

require 'pp'
pp ProductColor.all

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


En fait, ce require 'pp'n'est pas possible rails console --sandbox. Pour une raison quelconque, je reçois falsequand j'essaye d'exiger pp. Oups! il semble que ce ppsoit déjà requis par défaut dans rails console. Je viens de le faire pp Model.connection_handleret j'ai obtenu une grosse sortie imprimée. Merci.
Vert

@Green Si requireretourne false, cela signifie simplement que le fichier a déjà été chargé.
sepp2k

Pourquoi inspectne s'affiche pas lorsque vous faites juste ProductColor.all?
Arnold Roa

3

Pour ajouter à la suggestion d'Alter Lago d'utiliser AwesomePrint, si vous ne pouvez pas / ne devriez pas / ne voulez pas ajouter le gem 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)

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.