Cara mendapatkan pemformatan yang bagus di konsol Rails

127

Saya ingin sesuatu seperti ini terlihat bagus:

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

Ini tidak berfungsi:

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

Dan tidak juga ini:

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

Pikiran?

Tom Lehman
sumber

Jawaban:

255

The ymetode adalah cara praktis untuk mendapatkan beberapa output YAML cantik.

y ProductColor.all

Dengan asumsi Anda masuk script/console

Seperti komentar jordanpg, jawaban ini sudah usang. Untuk Rails 3.2+ Anda perlu mengeksekusi kode berikut sebelum Anda bisa mendapatkan ymetode untuk bekerja:

YAML::ENGINE.yamler = 'syck'

Dari ruby-docs

Dalam versi Ruby yang lebih lama, yaitu. <= 1.9, Syck masih disediakan, namun sepenuhnya dihapus dengan rilis Ruby 2.0.0.

Untuk rel 4 / ruby ​​2 Anda bisa menggunakan saja

puts object.to_yaml
ryanb
sumber
5
ini harus ditandai sebagai jawaban yang tepat karena sudah ada di dalamnya, dapat langsung digunakan, dan yang paling penting, sederhana.
botbot
15
Jawaban ini sudah usang. Lihat: stackoverflow.com/questions/11571801/... Untuk membuat ini berfungsi, Anda harus terlebih dahulu mengeksekusi YAML::ENGINE.yamler = 'syck'.
jordanpg
5
Sekarang YAML :: ENGINE.yamler = 'psych'
jumpa
Ini mirip dengan ryanb >> ProductColor.all >> y _
Deepak Lamichhane
1
seperti @botbot katakan di atas, ini adalah jawaban terbaik karena ini berlaku untuk situasi di mana Anda tidak memiliki akses ke .irbrc, alat konsol lain, atau konfigurasi konsol lainnya (seperti, menjadi pengembang kontrak dengan akses terbatas ke wadah / server produksi )
Todd
97

Anda harus mencoba hirb . Ini adalah permata yang dibuat untuk memformat objek di konsol ruby. Skrip / sesi konsol Anda akan terlihat seperti ini:

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

Anda dapat mempelajari lebih lanjut tentang hirb di beranda .

cldwalker
sumber
3
Jawaban ryanb pada dasarnya adalah apa yang saya cari, tetapi ini terlalu keren untuk tidak menerimanya.
Tom Lehman
7
Meskipun bukan jawaban untuk pertanyaan asli, mungkin menunjukkan bahwa Anda dapat menambahkan hal-hal hirb ke ~ / .irbrc Anda sehingga Anda tidak perlu meminta dan mengaktifkannya setiap kali.
jordelver
1
Permata ini sudah usang sekarang.
Amrit Dhungana
Apakah ada cara untuk "dengan mudah" mengurutkan kolom dari output? Saya ingin memaksa id kolom menjadi yang pertama dan updated_at & Created_at di akhir (jika Anda menambahkan kolom setelah migrasi pertama, kolom updated_at & Created_at tidak akan berada di akhir)
MrYoshiji
27

Cetak mengagumkan juga bagus jika Anda menginginkan sebuah objek berlekuk. Sesuatu seperti:

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

Untuk mengintegrasikan secara default dengan irb Anda / rel / membongkar konsol, menambah Anda ~/.irbrcatau ~/.pryrcberkas:

require "awesome_print"
AwesomePrint.irb! # just in .irbrc
AwesomePrint.pry! # just in .pryrc
Alter Lagos
sumber
1
Bisakah saya menggunakan permata ini dengan Rails 4 atau 5 ?? Saya telah menemukan catatan berikut di halaman github: CATATAN: awesome_print v1.2.0 adalah rilis terakhir yang mendukung versi Ruby sebelum v1.9.3 dan versi Rails sebelum v3.0. Awesome_print v2.0 yang akan datang akan membutuhkan Ruby v1.9.3 atau lebih baru dan Rails v3.0 atau lebih baru. Apakah ini berarti bahwa permata sudah ketinggalan zaman dengan versi ini dan menyebabkan konflik ??
ltdev
12
>> puts ProductColor.all.to_yaml

Cukup berhasil!

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

Rody
sumber
Ini sangat bagus! Saya tidak bisa mendapatkan jawaban terpilih lainnya untuk berfungsi ... Saya kira karena saya menggunakan ActiveResource (sumber daya API)
Crimbo
11

Dapat juga dicatat bahwa Anda dapat menggunakan:

j ProductColor.all.inspect

untuk output dalam format Json daripada Yaml

davidcollom
sumber
ini bisa gagal tergantung pada versi JSON / ruby, dan format yang bagus mungkin diperlukan di lingkungan di mana orang tidak bisa memiliki hal
Todd
3
Galat kenaikan ini: JSON :: GeneratorError: hanya generasi objek atau array JSON yang diizinkan
Hassan Akram
8

Hai, Anda juga dapat mencoba ini di skrip / konsol Anda jika

>> y ProductColor.all

tidak bekerja untukmu

Coba ini:

>> require 'yaml'

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

kemudian

>> y ProductColor.all
AllenC
sumber
7

Saya punya beberapa masalah untuk membuatnya bekerja jadi saya akan menambahkan dua sen saya ke awesome_print menambahkan ini ke Gemfile Anda, terutama di :development

gem 'awesome_print', require: 'ap'

lalu masuk

rails console

Anda dapat melakukan

> ap Model.all Itu dia. Namun Anda juga bisa menambahkan

require "awesome_print"
AwesomePrint.irb!

ke ~ / .irbrc Anda, cara ini awesome_print akan diperlukan kapan saja Anda membuka konsol dan Anda cukup melakukannya

Model.all tanpa perlu mengetik ap

AndreiMotinga
sumber
6

Anda juga dapat mencoba yang berikut ini untuk sekelompok objek

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

Ini akan memberi Anda hasil yang lebih baik , seperti

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

Memanggil to_yamlatribut daripada objek itu sendiri menyelamatkan Anda dari melihat isi penuh objek dalam output

Atau puts Object.last.attributes.to_yamluntuk satu objek

Steno juga tersedia: y Object.last.attributes

Abram
sumber
6

Saya pikir solusi ini adalah yang paling akurat. Anda harus mencoba ini:

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

Ini akan memberi Anda output yang sangat bagus dibandingkan dengan format 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
sumber
5

Gunakan irbtoolspermata.

Ini akan secara otomatis memformat output konsol plus Anda akan mendapatkan banyak fitur hebat.

VivekVarade123
sumber
Bagus! Tapi saya tidak bisa memformat konten ActiveResource ... kecuali saya melakukan sesuatu yang salah
Crimbo
4

Anda mungkin ingin mendefinisikan metode pemeriksaan ProductColor untuk mengembalikan sesuatu yang Anda anggap bagus. Sebagai contoh:

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

Setelah itu hasil dari ProductColor.all akan ditampilkan sebagai sesuatu seperti [<1 - Putih (Putih)>, ...]. Tentu saja Anda harus menyesuaikan metode inspeksi dengan kebutuhan Anda, sehingga itu akan menampilkan semua informasi yang Anda butuhkan dengan gaya yang Anda sukai.

Sunting: juga jika masalahnya adalah kurangnya jeda baris dalam output, Anda dapat mencoba

require 'pp'
pp ProductColor.all

yang harus menyisipkan linebreak jika perlu

sepp2k
sumber
Sebenarnya require 'pp'tidak mungkin di rails console --sandbox. Untuk beberapa alasan saya dapatkan falseketika saya mencoba untuk meminta pp. Ups! sepertinya ppsudah diperlukan secara default di rails console. Saya baru saja melakukannya pp Model.connection_handlerdan mendapat hasil cetak yang cukup besar. Terima kasih.
Hijau
@ Hijau Jika requirekembali false, itu berarti bahwa file telah dimuat.
sepp2k
Mengapa inspecttidak ditampilkan saat melakukan hal yang benar ProductColor.all?
Arnold Roa
3

Untuk menambah saran Alter Lago untuk menggunakan AwesomePrint, Jika Anda tidak bisa / tidak seharusnya / tidak ingin menambahkan permata awesome_print ke Gemfile proyek Anda, lakukan ini:

gem install awesome_print

Edit ~ / .irb.rc dan tambahkan ini:

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

(Tentu saja memastikan jalur dan versinya benar)

Excalibur
sumber