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?

Tom Lehman
la source

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
Ryanb
la source
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 .

cldwalker
la source
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 => "[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 fichier ~/.irbrcou ~/.pryrc:

require "awesome_print"
AwesomePrint.irb! # just in .irbrc
AwesomePrint.pry! # just in .pryrc
Alter Lagos
la source
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

Rody
la source
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

Davidcollom
la source
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
AllenC
la source
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

AndreiMotinga
la source
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

Abram
la source
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"
  }
]
Peter Nguyen
la source
5

Utilisez des irbtoolsgemmes.

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

VivekVarade123
la source
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

sepp2k
la source
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)

Excalibur
la source