Làm thế nào để có được định dạng đẹp trong bảng điều khiển Rails


127

Tôi muốn có được một cái gì đó như thế này để trông đẹp:

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

Điều này không hoạt động:

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

Và điều này cũng không:

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

Suy nghĩ?

Câu trả lời:


255

Các yphương pháp là một cách tiện dụng để có được một số lượng YAML khá.

y ProductColor.all

Giả sử bạn đang ở trong script/console

Như jordanpg đã nhận xét, câu trả lời này đã lỗi thời. Đối với Rails 3.2+, bạn cần thực thi đoạn mã sau trước khi có thể khiến yphương thức hoạt động:

YAML::ENGINE.yamler = 'syck'

Từ ruby-docs

Trong các phiên bản Ruby cũ hơn, tức là. <= 1.9, Syck vẫn được cung cấp, tuy nhiên nó đã bị xóa hoàn toàn với việc phát hành Ruby 2.0.0.

Đối với đường ray 4 / ruby ​​2 bạn chỉ có thể sử dụng

puts object.to_yaml

5
đây nên được đánh dấu là câu trả lời đúng vì nó được tích hợp sẵn, có thể được sử dụng ngay lập tức và hầu hết, đơn giản.
botbot

15
Câu trả lời này đã lỗi thời. Xem: stackoverflow.com/questions/11571801/ khăn Để thực hiện công việc này, trước tiên bạn phải thực hiện YAML::ENGINE.yamler = 'syck'.
jordanpg

5
Bây giờ là YAML :: Engine.yamler = 'psych'
jumpa

Điều này tương tự với ryanb >> ProductColor.all >> y _
Deepak Lamichhane

1
như @botbot đã nói ở trên, đây là câu trả lời tốt nhất vì nó áp dụng cho các tình huống mà bạn không có quyền truy cập vào một .irbrccông cụ bảng điều khiển khác hoặc các cấu hình khác của bảng điều khiển (như là một nhà phát triển được ký hợp đồng với quyền truy cập hạn chế vào bộ chứa / máy chủ sản xuất )
Todd

97

Bạn nên thử hirb . Đó là một viên đá quý được tạo ra cho các đối tượng định dạng đẹp trong bảng điều khiển ruby. Phiên script / console của bạn sẽ như thế này:

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

Bạn có thể tìm hiểu thêm về hirb tại trang chủ của nó .


3
Câu trả lời của ryanb về cơ bản là những gì tôi đang tìm kiếm, nhưng điều này quá tuyệt vời để không chấp nhận.
Tom Lehman

7
Mặc dù không phải là câu trả lời cho câu hỏi ban đầu, nhưng có thể chỉ ra rằng bạn có thể thêm nội dung hirb vào ~ / .irbrc để bạn không phải yêu cầu và bật nó mỗi lần.
jordelver

1
Đá quý này đã lỗi thời.
Amrit Dhungana

Có cách nào để "dễ dàng" sắp xếp các cột của đầu ra không? Tôi rất thích buộc id cột là đầu tiên và update_at & created_at ở cuối (nếu bạn thêm các cột sau lần di chuyển đầu tiên, các cột
update_at

27

In tuyệt vời là tốt đẹp quá nếu bạn muốn một đối tượng thụt lề. Cái gì đó như:

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

Để tích hợp nó theo mặc định với bảng điều khiển irb / rails / pry của bạn, hãy thêm vào tệp ~/.irbrchoặc ~/.pryrctệp của bạn :

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

1
Tôi có thể sử dụng đá quý này với Rails 4 hoặc 5 ?? Tôi đã tìm thấy ghi chú sau trong trang github: LƯU Ý: awesome_print v1.2.0 là phiên bản cuối cùng hỗ trợ các phiên bản Ruby trước phiên bản v1.9.3 và Rails trước phiên bản 3.0. Awesome_print v2.0 sắp tới sẽ yêu cầu Ruby v1.9.3 trở lên và Rails v3.0 trở lên. Điều này có nghĩa là đá quý đã lỗi thời với các phiên bản này và gây ra xung đột ??
ltdev

12
>> puts ProductColor.all.to_yaml

Đơn giản là hoạt động tốt!

Nguồn: https://stackoverflow.com/a/4830096


Điều này làm việc tuyệt vời! Tôi không thể làm cho các câu trả lời được bình chọn hàng đầu khác hoạt động ... Tôi đoán vì tôi đang sử dụng ActiveResource (tài nguyên API)
Crimbo

11

Cũng có thể lưu ý rằng bạn có thể sử dụng:

j ProductColor.all.inspect

để xuất ở định dạng Json chứ không phải Yaml


điều này có thể thất bại tùy thuộc vào phiên bản JSON / ruby ​​và định dạng đẹp có thể cần thiết trong môi trường mà người ta không thể có những thứ hay
ho

3
Lỗi nâng cao này: JSON :: GeneratorError: chỉ tạo các đối tượng hoặc mảng JSON được phép
Hassan Akram

8

Xin chào, bạn cũng có thể thử điều này trong tập lệnh / bảng điều khiển của mình nếu

>> y ProductColor.all

không làm việc cho bạn

Thử cái này:

>> require 'yaml'

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

sau đó

>> y ProductColor.all

7

Tôi đã gặp một số rắc rối khiến nó hoạt động vì vậy tôi sẽ thêm hai xu của mình vào awesome_print thêm phần này vào Gemfile của bạn, tốt nhất là trong :development

gem 'awesome_print', require: 'ap'

sau đó trong

rails console

bạn có thể làm

> ap Model.all Đó là nó. Tuy nhiên, bạn cũng có thể thêm

require "awesome_print"
AwesomePrint.irb!

với ~ / .irbrc của bạn, theo cách này awesome_print sẽ được yêu cầu bất cứ khi nào bạn mở bàn điều khiển và bạn chỉ cần làm

Model.all mà không cần gõ ap


6

Bạn cũng có thể thử cách sau đây cho một nhóm đối tượng

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

Điều này sẽ cung cấp cho bạn đầu ra đẹp hơn nhiều , như

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

Gọi to_yamlthuộc tính chứ không phải chính đối tượng giúp bạn không xem toàn bộ nội dung của đối tượng trong đầu ra

Hoặc puts Object.last.attributes.to_yamlcho một đối tượng

Tốc ký cũng có sẵn: y Object.last.attributes


6

Tôi nghĩ rằng giải pháp này là chính xác nhất. Bạn nên thử điều này:

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

Điều này sẽ cung cấp cho bạn một đầu ra siêu đẹp so với định dạng 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

Sử dụng irbtoolsđá quý.

Nó sẽ tự động định dạng đầu ra giao diện điều khiển cộng với bạn sẽ nhận được vô số tính năng tuyệt vời.


Đẹp! Nhưng tôi không thể định dạng nó để định dạng nội dung ActiveResource ... trừ khi tôi làm sai điều gì đó
Crimbo

4

Bạn có thể muốn xác định phương thức kiểm tra của ProductColor để trả về thứ mà bạn thấy đẹp. Ví dụ:

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

Sau đó, kết quả của ProductColor.all sẽ hiển thị dưới dạng [<1 - Trắng (Trắng)>, ...]. Tất nhiên bạn nên điều chỉnh phương thức kiểm tra theo nhu cầu của mình, để nó hiển thị tất cả thông tin bạn cần theo một phong cách mà bạn thích.

Chỉnh sửa: cũng có thể nếu vấn đề là thiếu ngắt dòng ở đầu ra, bạn có thể thử

require 'pp'
pp ProductColor.all

Nên chèn ngắt dòng khi thích hợp


Như một vấn đề thực tế require 'pp'là không thể rails console --sandbox. Vì một số lý do tôi nhận được falsekhi tôi cố gắng yêu cầu pp. Giáo sư! có vẻ như ppđã được yêu cầu theo mặc định rails console. Tôi vừa làm pp Model.connection_handlervà có đầu ra in khá lớn. Cảm ơn.
Màu xanh lá cây

@Green Nếu requiretrả về false, điều đó chỉ có nghĩa là tệp đã được tải.
sepp2k

Tại sao inspectkhông được hiển thị khi làm chỉ ProductColor.all?
Arnold Roa

3

Để thêm vào đề xuất của Alter Lago khi sử dụng AwesomePrint, Nếu bạn không thể / không nên / không muốn thêm đá quý awesome_print vào Gemfile của dự án, hãy làm điều này:

gem install awesome_print

Chỉnh sửa ~ / .irb.rc và thêm phần này:

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

(Tất nhiên, đảm bảo đường dẫn và phiên bản là chính xác)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.