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?

Tom Lehman
fonte

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
ryanb
fonte
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 .

cldwalker
fonte
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 => "[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
    }
]

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
Alter Lagos
fonte
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

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

davidcollom
fonte
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
AllenC
fonte
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

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

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

Use irbtoolsgema.

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

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

sepp2k
fonte
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)

Excalibur
fonte