Come ottenere una buona formattazione nella console di Rails


127

Voglio che qualcosa del genere appaia bello:

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

Risposte:


255

Il ymetodo è un modo pratico per ottenere un output YAML carino.

y ProductColor.all

Supponendo che tu sia dentro script/console

Come ha commentato jordanpg, questa risposta è obsoleta. Per Rails 3.2+ è necessario eseguire il codice seguente prima di poter far funzionare il ymetodo:

YAML::ENGINE.yamler = 'syck'

Da ruby-docs

Nelle versioni precedenti di Ruby, ad es. <= 1.9, Syck è ancora fornito, tuttavia è stato completamente rimosso con il rilascio di Ruby 2.0.0.

Per rails 4 / ruby ​​2 puoi usare solo

puts object.to_yaml

5
questa dovrebbe essere contrassegnata come la risposta giusta poiché è integrata, può essere utilizzata immediatamente e, soprattutto, semplice.
botbot,

15
Questa risposta è obsoleta. Vedi: stackoverflow.com/questions/11571801/… Per farlo funzionare, devi prima eseguire YAML::ENGINE.yamler = 'syck'.
jordanpg,

5
Ora è YAML :: ENGINE.yamler = 'psych'
jumpa il

È simile a ryanb >> ProductColor.all >> y _
Deepak Lamichhane

1
come detto sopra @botbot, questa è la risposta migliore poiché si applica a situazioni in cui non si ha accesso a .irbrc, altri strumenti della console o altre configurazioni della console (come essere un sviluppatore contratto con accesso limitato a un container / server di produzione )
Todd,

97

Dovresti provare Hirb . È una gemma creata per formattare graziosamente 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 .


3
la risposta di ryanb è fondamentalmente quello che stavo cercando, ma è troppo bello per non accettarlo.
Tom Lehman,

7
Sebbene non sia una risposta alla domanda originale, è possibile che tu possa aggiungere le cose hirb al tuo ~ / .irbrc in modo da non doverle richiedere e abilitarle ogni volta.
jordelver,

1
Questo gioiello è obsoleto ora.
Amrit Dhungana,

C'è un modo per "facilmente" ordinare le colonne dell'output? Mi piacerebbe forzare l'ID colonna per essere il primo e aggiornato_at e Created_at alla fine (se aggiungi colonne dopo la prima migrazione le colonne updated_at & Created_at non saranno alla fine)
MrYoshiji

27

Anche la stampa eccezionale è bella se si desidera rientrare un oggetto. Qualcosa di simile a:

$ 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 di default con la tua console irb / rails / pry, aggiungi al tuo ~/.irbrco al ~/.pryrcfile:

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

1
Posso usare questo gioiello con Rails 4 o 5 ?? Ho trovato la seguente nota nella pagina github: NOTA: awesome_print v1.2.0 è l'ultima versione che supporta le versioni di Ruby precedenti alla v1.9.3 e le versioni di Rails precedenti alla v3.0. L'imminente awesome_print v2.0 richiederà Ruby v1.9.3 o successive e Rails v3.0 o successive. Questo significa che la gemma è obsoleta con queste versioni e causa conflitti ??
ltd

12
>> puts ProductColor.all.to_yaml

Funziona semplicemente bene!

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


Funziona benissimo! Non sono riuscito a ottenere le risposte più votate per funzionare ... Immagino perché sto usando ActiveResource (risorse API)
Crimbo

11

Si può anche notare che è possibile utilizzare:

j ProductColor.all.inspect

per l'output in formato Json anziché Yaml


questo può fallire a seconda della versione di JSON / ruby ​​e potrebbe essere necessaria una buona formattazione in un ambiente in cui non si possono avere cose carine
Todd

3
Errore di rilancio: JSON :: GeneratorError: consentita solo generazione di oggetti o array JSON
Hassan Akram,

8

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'

poi

>> y ProductColor.all

7

Ho avuto qualche problema a farlo funzionare, quindi aggiungerò i miei due centesimi a awesome_print aggiungendo questo al tuo Gemfile, preferibilmente in :development

gem 'awesome_print', require: 'ap'

poi dentro

rails console

tu puoi fare

> 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


6

Puoi anche provare quanto segue per un gruppo di oggetti

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

Questo ti darà un output molto più bello , come

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

Richiamare gli to_yamlattributi anziché l'oggetto stesso ti evita di visualizzare l'intero contenuto dell'oggetto nell'output

O puts Object.last.attributes.to_yamlper un singolo oggetto

La stenografia è inoltre disponibile: y Object.last.attributes


6

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

5

Usa irbtoolsgemma.

Formatterà automaticamente l'output della console e otterrai tonnellate di fantastiche funzionalità.


Bello! Ma non riesco a formattare il contenuto di ActiveResource ... a meno che non
stia

4

Potresti voler definire il metodo di ispezione di ProductColor per restituire qualcosa che ritieni carino. Per esempio:

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

Dopodiché 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, se del caso


È un dato di fatto require 'pp'non è possibile rails console --sandbox. Per qualche motivo che ottengo falsequando provo a richiedere pp. Oops! sembra che ppsia già richiesto di default in rails console. Ho appena fatto pp Model.connection_handlere ho ottenuto grandi stampe piuttosto stampate. Grazie.
Green,

@Verde Se requireritorna false, significa che il file è già stato caricato.
sepp2k,

Perché inspectnon viene visualizzato quando si fa semplicemente ProductColor.all?
Arnold Roa,

3

Per aggiungere al suggerimento di Alter Lago per l'uso di AwesomePrint, se non puoi / non dovresti / non vuoi aggiungere la gemma awesome_print al Gemfile del tuo progetto, procedi come segue:

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)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.