Como obter uma boa formatação no console do Rails


127

Quero que algo assim fique bonito:

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

Isso não funciona:

>> 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 nem isso:

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

Pensamentos?

Respostas:


255

O ymétodo é uma maneira útil de obter uma saída YAML bonita.

y ProductColor.all

Supondo que você esteja script/console

Como o jordanpg comentou, esta resposta está desatualizada. Para o Rails 3.2+, você precisa executar o seguinte código antes de conseguir que o ymétodo funcione:

YAML::ENGINE.yamler = 'syck'

De ruby-docs

Nas versões mais antigas do Ruby, ie. <= 1.9, o Syck ainda é fornecido, no entanto, foi completamente removido com o lançamento do Ruby 2.0.0.

Para trilhos 4 / ruby ​​2, você pode usar apenas

puts object.to_yaml

5
isso deve ser marcado como a resposta certa, pois está embutido, pode ser usado imediatamente e, acima de tudo, simples.
botbot

15
Esta resposta está desatualizada. Consulte: stackoverflow.com/questions/11571801/… Para fazer isso funcionar, você deve primeiro executar YAML::ENGINE.yamler = 'syck'.
jordanpg

5
Agora é YAML :: ENGINE.yamler = 'psych'
jumpa

Isso é semelhante ao ryanb >> ProductColor.all >> y _
Deepak Lamichhane

1
como o @botbot disse acima, esta é a melhor resposta, pois se aplica a situações em que você não tem acesso a um .irbrc, outras ferramentas do console ou outras configurações do console (como ser um desenvolvedor contratado com acesso limitado a um contêiner / servidor de produção )
Todd

97

Você deve tentar hirb . É uma jóia feita para formatar objetos bonitos no console ruby. Sua sessão de script / console ficaria assim:

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

Você pode aprender mais sobre o hirb em sua página inicial .


3
A resposta de ryanb é basicamente o que eu estava procurando, mas isso é muito legal para não aceitar.
6116 Tom Lehman

7
Embora não seja uma resposta para a pergunta original, pode estar indicando que você pode adicionar o material hirb ao seu ~ / .irbrc, para que você não precise solicitá-lo e ativá-lo sempre.
jordelver

1
Esta jóia está desatualizada agora.
Amrit Dhungana

Existe uma maneira de "facilmente" classificar as colunas da saída? Eu adoraria para forçar o ID de coluna para ser o primeiro e updated_at & created_at no final (se você adicionar colunas após a primeira migração dos updated_at & created_at colunas não será no final)
MrYoshiji

27

Impressão impressionante também é boa se você quiser um objeto recuado. Algo como:

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

Para integrá-lo por padrão ao seu console irb / rails / pry, adicione ao seu ~/.irbrcou ~/.pryrcarquivo:

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

1
Posso usar esta gema com Rails 4 ou 5 ?? Encontrei a seguinte observação na página do github: NOTA: awesome_print v1.2.0 é a última versão que suporta versões do Ruby anteriores à v1.9.3 e versões do Rails anteriores à v3.0. O próximo awesome_print v2.0 exigirá o Ruby v1.9.3 ou posterior e o Rails v3.0 ou posterior. Isso significa que a gema está desatualizada com essas versões e causa conflitos?
ltdev

12
>> puts ProductColor.all.to_yaml

Simplesmente funciona bem!

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


Isso funciona muito bem! Não consegui obter as outras respostas votadas para o trabalho ... Acho que porque estou usando o ActiveResource (recursos de API) #
181

11

Também pode ser observado que você pode usar:

j ProductColor.all.inspect

para saída no formato Json em vez de Yaml


isso pode falhar, dependendo da versão do JSON / ruby, e a boa formatação pode ser necessária em um ambiente em que não é possível ter boas coisas.
Todd

3
Este erro de aumento: JSON :: GeneratorError: somente geração de objetos ou matrizes JSON permitidos
Hassan Akram

8

Oi, você também pode tentar isso no seu script / console se

>> y ProductColor.all

não está trabalhando para você.

Tente o seguinte:

>> require 'yaml'

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

então

>> y ProductColor.all

7

Eu tive alguns problemas para fazê-lo funcionar, então adicionarei meus dois centavos a awesome_print e adicione isso ao seu Gemfile, de preferência em :development

gem 'awesome_print', require: 'ap'

então em

rails console

você pode fazer

> ap Model.all É isso aí. No entanto, você também pode adicionar

require "awesome_print"
AwesomePrint.irb!

para o seu ~ / .irbrc, desta forma awesome_print será necessário sempre que você abrir o console e você pode simplesmente

Model.all sem a necessidade de digitar ap


6

Você também pode tentar o seguinte para um grupo de objetos

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

Isso fornecerá uma saída muito melhor , como

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

Chamando to_yaml atributos em vez do próprio objeto evita que você visualize o conteúdo completo do objeto na saída

Ou puts Object.last.attributes.to_yamlpara um único objeto

A taquigrafia também está disponível: y Object.last.attributes


6

Penso que esta solução é a mais precisa. Você deve tentar o seguinte:

puts JSON.pretty_generate Entry.all.map(&:attributes)

Isso lhe dará uma saída super agradável comparada ao 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

Use irbtoolsgema.

Formatará automaticamente a saída do console, além de obter muitos recursos excelentes.


Agradável! Mas não consigo formatar o conteúdo do ActiveResource ... a menos que eu esteja fazendo algo errado #
181

4

Você pode definir o método de inspeção do ProductColor para retornar algo que achar interessante. Por exemplo:

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

Após o qual o resultado de ProductColor.all será exibido como algo como [<1 - Branco (Branco)>, ...]. Obviamente, você deve ajustar o método de inspeção às suas necessidades, para que ele exiba todas as informações necessárias no estilo que você gosta.

Editar: também se o problema foi a falta de quebras de linha na saída, você pode tentar

require 'pp'
pp ProductColor.all

que deve inserir quebras de linha quando apropriado


Por uma questão de fato require 'pp'não é possível em rails console --sandbox. Por alguma razão, recebo falsequando tento exigir pp. Opa! parece que ppjá é exigido por padrão no rails console. Acabei de fazer pp Model.connection_handlere consegui grandes impressões bonitas. Obrigado.
Verde

@ Green Se requireretornar false, isso significa que o arquivo já foi carregado.
sepp2k

Por que o inspectnão é exibido ao fazer apenas ProductColor.all?
Arnold Roa

3

Para adicionar à sugestão do Alter Lago para usar o AwesomePrint, se você não pode / não deve / não deseja adicionar a gema awesome_print ao Gemfile do seu projeto, faça o seguinte:

gem install awesome_print

Edite ~ / .irb.rc e adicione:

$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'

(Certificando-se de que o caminho e a versão estejam corretos, é claro)

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.