Come ottenere una formattazione gradevole nella console Rails
-
22-07-2019 - |
Domanda
Voglio ottenere qualcosa del genere per avere un bell'aspetto:
>> 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">]
Questo non funziona:
>> 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\">]"
E nemmeno questo:
>> 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"
Pensieri?
Soluzione
IL y
è un modo pratico per ottenere un bel output YAML.
y ProductColor.all
Supponendo che tu sia dentro script/console
Come ha commentato jordanpg, questa risposta è obsoleta.Per Rails 3.2+ è necessario eseguire il seguente codice prima di poter ottenere il file y
metodo di lavoro:
YAML::ENGINE.yamler = 'syck'
Da ruby-doc
Nelle versioni Ruby precedenti, ad es.<= 1.9, Syck è ancora fornito, tuttavia è stato completamente rimosso con il rilascio di Ruby 2.0.0.
Per i binari 4/Ruby 2 potresti usare just
puts object.to_yaml
Altri suggerimenti
Dovresti provare hirb . È una gemma creata per formattare oggetti nella console ruby. La tua sessione di script / console sarebbe simile a questa:
>> 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
Puoi saperne di più su hirb nella sua homepage .
Impressionante stampa è bello anche se vuoi un oggetto rientrato. Qualcosa del tipo:
$ 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
}
]
Per integrarlo per impostazione predefinita con la tua console irb / rails / pry, aggiungi al tuo ~/.irbrc
o ~/.pryrc
file:
require "awesome_print"
AwesomePrint.irb! # just in .irbrc
AwesomePrint.pry! # just in .pryrc
Si può anche notare che è possibile utilizzare:
j ProductColor.all.inspect
per l'output in formato Json anziché Yaml
>> puts ProductColor.all.to_yaml
Funziona semplicemente bene!
Ciao, puoi anche provare questo nel tuo script / console se
>> y ProductColor.all
non funziona per te.
Prova questo:
>> require 'yaml'
>> YAML::ENGINE.yamler = 'syck'
quindi
<*> Ho avuto qualche problema a farlo funzionare, quindi aggiungerò i miei due centesimi a awesome_print
aggiungilo al tuo Gemfile, preferibilmente in :development
gem 'awesome_print', require: 'ap'
quindi in
rails console
puoi farlo
> ap Model.all
Questo è tutto. Tuttavia puoi anche aggiungere
require "awesome_print"
AwesomePrint.irb!
sul tuo ~ / .irbrc, in questo modo sarà richiesto awesome_print ogni volta che apri la console e puoi semplicemente farlo
Model.all senza la necessità di digitare ap
Usa irbtools
gemma.
Formatterà automaticamente l'output della console e otterrai tantissime fantastiche funzionalità.
Potresti voler definire il metodo di ispezione di ProductColor per restituire qualcosa che ritieni carino. Ad esempio:
def inspect
"<#{id} - #{name} (#{internal_name})>"
end
Dopo di che il risultato di ProductColor.all verrà visualizzato come qualcosa di simile a [< 1 - Bianco (bianco) > ;, ...]. Ovviamente dovresti adattare il metodo inspect alle tue esigenze, in modo che mostri tutte le informazioni di cui hai bisogno in uno stile che ti piace.
Modifica: anche se il problema era la mancanza di interruzioni di linea nell'output, potresti provare
require 'pp'
pp ProductColor.all
che dovrebbe inserire interruzioni di riga dove appropriato
Per aggiungere al suggerimento di Alter Lago per l'utilizzo di AwesomePrint, Se non puoi / non dovresti / non vuoi aggiungere la gemma awesome_print al Gemfile del tuo progetto, fai questo:
gem install awesome_print
Modifica ~ / .irb.rc e aggiungi questo:
$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'
(Accertandosi che il percorso e la versione siano corretti, ovviamente)
Puoi anche provare quanto segue per un gruppo di oggetti
Object.all.map(&:attributes).to_yaml
Questo ti darà un output molto migliore , come
---
id: 1
type: College
name: University of Texas
---
id: 2
type: College
name: University of California
Chiamare to_yaml
sugli attributi anziché sull'oggetto stesso ti salva dalla visualizzazione dell'intero contenuto dell'oggetto nell'output
O puts Object.last.attributes.to_yaml
per un singolo oggetto
È disponibile anche una scorciatoia: y Object.last.attributes
Penso che questa soluzione sia la più accurata. Dovresti provare questo:
puts JSON.pretty_generate Entry.all.map(&:attributes)
Questo ti darà un output super bello rispetto al formato 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"
}
]