Cómo obtener un buen formato en la consola de Rails

127

Quiero que algo como esto se vea bien:

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

Esto no 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\">]"

Y tampoco esto:

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

Pensamientos?

Tom Lehman
fuente

Respuestas:

255

El ymétodo es una forma práctica de obtener una bonita salida de YAML.

y ProductColor.all

Asumiendo que estás en script/console

Como comentó jordanpg, esta respuesta está desactualizada. Para Rails 3.2+ necesita ejecutar el siguiente código antes de que pueda hacer que el ymétodo funcione:

YAML::ENGINE.yamler = 'syck'

De ruby-docs

En versiones anteriores de Ruby, es decir. <= 1.9, Syck todavía se proporciona, sin embargo, se eliminó por completo con el lanzamiento de Ruby 2.0.0.

Para los rieles 4 / ruby ​​2 podría usar solo

puts object.to_yaml
ryanb
fuente
55
Esto debe marcarse como la respuesta correcta, ya que está integrado, se puede usar de inmediato y, sobre todo, simple.
botbot
15
Esta respuesta está desactualizada. Consulte: stackoverflow.com/questions/11571801/… Para que esto funcione, primero debe ejecutar YAML::ENGINE.yamler = 'syck'.
jordanpg
55
Ahora es YAML :: ENGINE.yamler = 'psych'
jumpa
Esto es similar a ryanb >> ProductColor.all >> y _
Deepak Lamichhane
1
como @botbot dijo anteriormente, esta es la mejor respuesta, ya que se aplica a situaciones en las que no tiene acceso a .irbrcotras herramientas de la consola u otras configuraciones de la consola (como ser un desarrollador contratado con acceso limitado a un contenedor / servidor de producción) )
Todd
97

Deberías probar hirb . Es una gema hecha para dar formato a objetos bonitos en la consola ruby. Su sesión de script / consola se vería así:

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

Puede obtener más información sobre hirb en su página de inicio .

caminante
fuente
3
La respuesta de Ryan es básicamente lo que estaba buscando, pero esto es demasiado genial para no aceptarlo.
Tom Lehman el
77
Si bien no es una respuesta a la pregunta original, podría estar señalando que puede agregar el material hirb a su ~ / .irbrc para que no tenga que requerirlo y habilitarlo cada vez.
jordelver
1
Esta gema está desactualizada ahora.
Amrit Dhungana 05 de
¿Hay alguna manera de ordenar "fácilmente" las columnas de la salida? Me encantaría forzar que el ID de la columna sea primero y actualizado_at & created_at al final (si agrega columnas después de la primera migración, las columnas updated_at & created_at no estarán al final)
MrYoshiji
27

La impresión impresionante también es agradable si quieres un objeto sangrado. 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 integrarlo de forma predeterminada con el IRB / carriles de palanca / consola, añadir a su ~/.irbrco ~/.pryrcarchivo:

require "awesome_print"
AwesomePrint.irb! # just in .irbrc
AwesomePrint.pry! # just in .pryrc
Alter Lagos
fuente
1
¿Puedo usar esta gema con Rails 4 o 5? He encontrado la siguiente nota en la página de github: NOTA: awesome_print v1.2.0 es la última versión que admite las versiones de Ruby anteriores a la v1.9.3 y las versiones de Rails anteriores a la v3.0. El próximo awesome_print v2.0 requerirá Ruby v1.9.3 o posterior y Rails v3.0 o posterior. ¿Significa esto que la gema está desactualizada con estas versiones y causa conflictos?
ltdev
12
>> puts ProductColor.all.to_yaml

Simplemente funciona bien!

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

Rody
fuente
¡Esto funciona muy bien! No pude obtener las otras respuestas más votadas para trabajar ... Supongo que porque estoy usando ActiveResource (recursos API)
Crimbo
11

También se debe tener en cuenta que puede usar:

j ProductColor.all.inspect

para imprimir en formato Json en lugar de Yaml

davidcollom
fuente
esto puede fallar dependiendo de la versión de JSON / ruby, y el buen formato puede ser necesario en un entorno donde uno no puede tener cosas buenas
Todd
3
Este error de subida: JSON :: GeneratorError: solo se permite la generación de objetos o matrices JSON
Hassan Akram
8

Hola, también puedes probar esto en tu script / consola si

>> y ProductColor.all

no funciona para ti

Prueba esto:

>> require 'yaml'

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

luego

>> y ProductColor.all
AllenC
fuente
7

Tuve algunos problemas para que funcione, así que agregaré mis dos centavos a awesome_print, agregue esto a su Gemfile, preferiblemente en :development

gem 'awesome_print', require: 'ap'

entonces en

rails console

tu puedes hacer

> ap Model.all Eso es. Sin embargo, también puedes agregar

require "awesome_print"
AwesomePrint.irb!

a su ~ / .irbrc, de esta manera se requerirá impresión impresionante cada vez que abra la consola y simplemente puede hacer

Model.all sin la necesidad de escribir ap

AndreiMotinga
fuente
6

También puede intentar lo siguiente para un grupo de objetos

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

Esto te dará una salida mucho más agradable , como

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

Invocar to_yamlatributos en lugar del objeto en sí le evita ver el contenido completo del objeto en la salida

O puts Object.last.attributes.to_yamlpara un solo objeto

La taquigrafía también está disponible: y Object.last.attributes

Abram
fuente
6

Creo que esta solución es la más precisa. Deberías probar esto:

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

Esto le dará una salida súper agradable en comparación con el 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
fuente
5

Usa irbtoolsgema.

Formateará automáticamente la salida de la consola y obtendrá toneladas de excelentes funciones.

VivekVarade123
fuente
¡Agradable! Pero no puedo lograr que formatee el contenido de ActiveResource ... a menos que esté haciendo algo mal
Crimbo
4

Es posible que desee definir el método de inspección de ProductColor para devolver algo que le parezca agradable. Por ejemplo:

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

Después de lo cual el resultado de ProductColor.all se mostrará como algo así como [<1 - Blanco (Blanco)>, ...]. Por supuesto, debe ajustar el método de inspección a sus necesidades, para que muestre toda la información que necesita en el estilo que desee.

Editar: también si el problema era la falta de saltos de línea en la salida, puede intentar

require 'pp'
pp ProductColor.all

que debe insertar saltos de línea cuando sea apropiado

sepp2k
fuente
De hecho, require 'pp'no es posible en rails console --sandbox. Por alguna razón me sale falsecuando trato de exigir pp. ¡Uy! parece que ppya se requiere por defecto en rails console. Acabo de hacerlo pp Model.connection_handlery obtuve una gran salida impresa. Gracias.
Verde
@Green Si requireregresa false, eso solo significa que el archivo ya se ha cargado.
sepp2k
¿Por qué inspectno se muestra cuando se hace justo ProductColor.all?
Arnold Roa
3

Para agregar a la sugerencia de Alter Lago para usar AwesomePrint, si no puede / no debe / no desea agregar la gema awesome_print al Gemfile de su proyecto, haga lo siguiente:

gem install awesome_print

Edite ~ / .irb.rc y agregue esto:

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

(Asegurándose de que la ruta y la versión sean correctas, por supuesto)

Excalibur
fuente