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?

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

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 .


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

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


¡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


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

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


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


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

5

Usa irbtoolsgema.

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


¡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


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)

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.