Railsコンソールで適切なフォーマットを取得する方法


127

私はこのようなものを美しく見せたいです:

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

これは機能しません:

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

そしてこれも行いません:

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

考え?

回答:


255

このyメソッドは、かなりのYAML出力を取得するための便利な方法です。

y ProductColor.all

あなたがいると仮定して script/console

jordanpgがコメントしたように、この回答は古くなっています。Rails 3.2以降の場合、yメソッドを機能させるには、次のコードを実行する必要があります。

YAML::ENGINE.yamler = 'syck'

ruby-docsから

古いRubyバージョン、つまり Syckは1.9以下で提供されていますが、Ruby 2.0.0のリリースで完全に削除されました。

レール4 /ルビー2の場合は、

puts object.to_yaml

5
これは組み込みなのですぐに使用でき、何よりも単純なので、正しい答えとしてマークする必要があります。
ボットボット

15
この回答は古くなっています。参照: stackoverflow.com/questions/11571801/… これを機能させるには、最初にを実行する必要がありますYAML::ENGINE.yamler = 'syck'
jordanpg、2012年

5
そのYAML :: ENGINE.yamler = '
psych

これは、ryanb >> ProductColor.all >> y _
Deepak Lamichhaneに類似

1
上記の@botbotのように、これは.irbrc、他のコンソールツール、またはコンソールの他の構成にアクセスできない状況に適用されるため、最良の答えです(たとえば、本番コンテナ/サーバーへのアクセスが制限された契約済みの開発者である場合) )
トッド

97

hirbを試してみてください。Rubyコンソールでオブジェクトをきれいにフォーマットするために作られた宝石です。スクリプト/コンソールセッションは次のようになります。

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

hirbの詳細については、そのホームページをご覧ください。


3
ライアンブの答えは基本的に私が探していたものですが、これは受け入れられないほどクールです。
トムリーマン

7
元の質問への回答ではありませんが、〜/ .irbrcにhirbの要素を追加できるため、毎回それを要求して有効にする必要がないことが指摘されている可能性があります。
jordelver

1
この宝石は現在古くなっています。
Amrit Dhungana、2014

出力の列を「簡単に」ソートする方法はありますか?列IDを最初に、最後にupdated_at&created_atに強制したいと思います(最初の移行後に列を追加した場合、updated_atおよびcreated_at列は最後にありません)
MrYoshiji

27

オブジェクトをインデントしたい場合は、素晴らしいプリントも便利です。何かのようなもの:

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

デフォルトでirb / rails / pryコンソールに統合するには、~/.irbrcまたは~/.pryrcファイルに追加します。

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

1
この宝石をRails 4または5で使用できますか?githubページで次のメモを見つけました。注:awesome_print v1.2.0は、v1.9.3より前のRubyバージョンとv3.0より前のRailsバージョンをサポートする最後のリリースです。今後のawesome_print v2.0では、Ruby v1.9.3以降とRails v3.0以降が必要になります。これは、gemがこれらのバージョンで古く、競合を引き起こしているということですか?
ltdev

12
>> puts ProductColor.all.to_yaml

単にうまくいきます!

ソース:https : //stackoverflow.com/a/4830096


これはうまくいきます!他の上位投票の回答を機能させることができませんでした... ActiveResource(APIリソース)を使用しているためと思います
Crimbo

11

次のものを使用できることにも注意してください。

j ProductColor.all.inspect

YamlではなくJson形式で出力する


これは、JSON /ルビーのバージョンによっては失敗する可能性があり、素敵なものができない環境では素敵なフォーマットが必要になる場合があります
Todd

3
このレイズエラー:JSON :: GeneratorError:JSONオブジェクトまたは配列の生成のみが許可されます
Hassan Akram

8

こんにちはあなたはあなたのスクリプト/コンソールでこれを試すこともできます

>> y ProductColor.all

あなたのために働いていません。

これを試して:

>> require 'yaml'

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

その後

>> y ProductColor.all

7

私はそれを機能させるのにいくつかの問題を抱えていたので、2セントをawesome_printに追加して、できればGemfileに追加します :development

gem 'awesome_print', require: 'ap'

それから

rails console

できるよ

> ap Model.all それでおしまい。ただし、追加することもできます

require "awesome_print"
AwesomePrint.irb!

〜/ .irbrcに、このようにコンソールを開いたときにawesome_printが必要になり、簡単に行うことができます

apを入力する必要のないModel.all


6

オブジェクトのグループに対して以下を試すこともできます

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

これにより、次のようなはるかに優れた出力が得られます。

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

to_yamlオブジェクト自体ではなく属性を呼び出すと、オブジェクトの完全な内容を出力で表示する必要がなくなります

またはputs Object.last.attributes.to_yaml単一のオブジェクトの場合

省略表記も利用できます。 y Object.last.attributes


6

この解決策が最も正確な解決策だと思います。あなたはこれを試す必要があります:

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

これにより、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

irbtools宝石を使用してください。

コンソールの出力を自動的にフォーマットするだけでなく、多くの優れた機能を利用できます。


いいね!しかし、ActiveResourceコンテンツをフォーマットすることはできません...何か間違っているのでない限り
Crimbo

4

ProductColorのinspectメソッドを定義して、気に入ったものを返すことができます。例えば:

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

その後、ProductColor.allの結果は[<1-White(White)>、...]のように表示されます。もちろん、inspectメソッドをニーズに合わせて調整し、必要なすべての情報を好みのスタイルで表示する必要があります。

編集:問題が出力の改行の欠如である場合も、試してみてください

require 'pp'
pp ProductColor.all

必要に応じて改行を挿入する必要があります


実際のところrequire 'pp'、では不可能ですrails console --sandbox。どういうわけか私がfalse要求することを試みるとき得ますpp。おっとっと!のppデフォルトではすでに必要なようですrails console。私はちょうどしpp Model.connection_handler、大きなきれいな印刷出力を得た。ありがとう。
グリーン

@Greenがをrequire返す場合false、それは単にファイルがすでにロードされていることを意味します。
sepp2k 2013年

inspectただやってみるとなぜ表示されないのProductColor.all
Arnold Roa 2017年

3

AwesomePrintを使用するためのAlter Lagoの提案に追加するには、プロジェクトのGemfileにawesome_print gemを追加できない/しない/したくない場合は、次のようにします。

gem install awesome_print

〜/ .irb.rcを編集して、これを追加します。

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

(もちろん、パスとバージョンが正しいことを確認する)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.