Comment obtenir un bon formatage dans la console Rails
-
22-07-2019 - |
Question
Je veux que quelque chose comme ça soit joli :
>> 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 ceci 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?
La solution
Le y
La méthode est un moyen pratique d’obtenir une jolie sortie YAML.
y ProductColor.all
En supposant que vous soyez 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 obtenir le y
méthode de travail :
YAML::ENGINE.yamler = 'syck'
Depuis Ruby-docs
Dans les anciennes versions de Ruby, c'est à dire.<= 1,9, le SYCK est toujours fourni, mais il a été complètement supprimé avec la libération de Ruby 2.0.0.
Pour les rails 4/ruby 2, vous pouvez utiliser simplement
puts object.to_yaml
Autres conseils
Vous devriez essayer hirb . C'est un petit bijou créé pour mettre en forme de jolis objets dans la console ruby. Votre script / session de console devrait ressembler à 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
Pour en savoir plus sur hirb, consultez sa page d'accueil .
Une impression géniale est également utile si vous souhaitez qu'un objet soit mis 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-le à votre fichier ~/.irbrc
ou ~/.pryrc
:
require "awesome_print"
AwesomePrint.irb! # just in .irbrc
AwesomePrint.pry! # just in .pryrc
Vous pouvez également noter que vous pouvez utiliser:
j ProductColor.all.inspect
pour produire au format Json plutôt que Yaml
>> puts ProductColor.all.to_yaml
Tout simplement fonctionne bien!
Bonjour, vous pouvez également essayer ceci dans votre script / console si
>> y ProductColor.all
ne travaille pas pour vous.
Essayez ceci:
>> require 'yaml'
>> YAML::ENGINE.yamler = 'syck'
puis
<*> J'ai eu quelques difficultés à le faire fonctionner, donc je vais ajouter mes deux sous à awesome_print
ajoutez ceci à votre Gemfile, de préférence dans :development
gem 'awesome_print', require: 'ap'
puis dans
rails console
vous pouvez faire
> ap Model.all
C'est tout. Cependant, vous pouvez aussi ajouter
require "awesome_print"
AwesomePrint.irb!
sur votre ~ / .irbrc, de cette façon, awesome_print sera requis à chaque fois que vous ouvrirez la console et que vous pourrez simplement le faire
.Modèle.all sans avoir besoin de taper ap
Utilisez irbtools
une gemme.
Il formatera automatiquement la sortie de la console et vous obtiendrez des tonnes de fonctionnalités exceptionnelles.
Vous pouvez définir la méthode d’inspection de ProductColor pour renvoyer un élément que vous trouvez intéressant. 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 adapter la méthode d’inspection à vos besoins afin qu’elle affiche toutes les informations dont vous avez besoin dans un style qui vous convient.
Modifier: même si le problème était le manque de sauts de ligne dans la sortie, essayez
require 'pp'
pp ProductColor.all
qui devrait insérer des sauts de ligne le cas échéant
Pour ajouter à la suggestion d'Alter Lago d'utiliser AwesomePrint, Si vous ne pouvez pas / ne devriez pas / ne voulez pas ajouter la gem awesome_print au fichier Gemfile de votre projet, procédez comme suit:
gem install awesome_print
Éditez ~ / .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)
Vous pouvez également essayer ce qui suit pour un groupe d'objets
Object.all.map(&:attributes).to_yaml
Cela vous donnera une beaucoup plus belle sortie, comme
---
id: 1
type: College
name: University of Texas
---
id: 2
type: College
name: University of California
Le fait d'appeler to_yaml
sur des attributs plutôt que sur l'objet lui-même vous évite d'afficher 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
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 comparée 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"
}
]