スリ飯屋MaLankaのフリーエンジニアな日々

IT実務未経験から約1年、東京でフリーランスのRuby on Railsエンジニアに転職。約2年半、大阪中崎町でスリランカカレーの間借りしてました。フリーランスエンジニアになるためのノウハウ、スリランカの事を発信していきます。

【awesome_print is not working】(pry) output error: #<NoMethodError: undefined method `marshal_dump' for #<ActiveModel::Errors:xxx>

【awesome_print is not working】(pry) output error: #&lt;NoMethodError: undefined method `marshal_dump' for #&lt;ActiveModel::Errors:xxx>




今すぐ案件紹介をご希望の方へ


このブログから登録の多いエージェントは下記の3つです★

(リンクをクリックすると公式サイトに飛びます)

【ダントツの1番人気】フォスターフリーランス【案件保有数5000件以上。業界25年の超老舗】

【僅差で2位】フリエン(furien)【実務経験1年未満でも案件アリ!】

【惜しくも3位】レバテックフリーランス【業界最大手。素早く手厚いフォローで案件参画】




こんにちは、mahです。


このブログでは、

僕がIT未経験から約1年でフリーランスエンジニアになるまでの過程、

ノウハウなどを書いていきます。


今回は、


  • 【awesome_print is not working】(pry) output error: #<NoMethodError: undefined method `marshal_dump' for #<ActiveModel::Errors:xxx>


について書いていきます。




【awesome_print is not working】(pry) output error: #<NoMethodError: undefined method `marshal_dump' for #<ActiveModel::Errors:xxx>




背景【awesome_printが動かない】



ActiveModelのインスタンスから errors を呼ぶと下記のようなエラー発生。

c = Contract.new
=> #<Contract:0x000055caae98f6v1>

c.save
=> false

c.errors
=> (pry) output error: #<NoMethodError: undefined method `marshal_dump' for #<ActiveModel::Errors:0x000055750ef88cd8>


エラー文「(pry) output error: #<NoMethodError: undefined method `marshal_dump' for #<ActiveModel::Errors:xxx>」でググるとIssueがヒット。


どうやらRailsから「marshal_dumpメソッド」が削除され、

その影響でawesome_printからも関係するコードが削除された模様。


  • Update CHANGELOG

Remove usage of marshal_dump since this was removed from recent Rails versions [@edipofederle]

Remove usage of marshal_dump since this was removed from Rails by edipofederle · Pull Request #415 · awesome-print/awesome_print · GitHub


  • Remove usage of marshal_dump since this was removed from Rails

Remove usage of marshal_dump since this was removed from Rails by edipofederle · Pull Request #415 · awesome-print/awesome_print · GitHub




解決策


どうするか?


amazing-print というgemで代用できるのでこれを使います。





amazing-print導入


# Gemfile
group :development do
  gem 'awesome_print' # 削除

  gem 'amazing_print' # 追加
end
$ bundle install
# .pryrc

# 削除
require "awesome_print"
AwesomePrint.pry!

# 追記
require "amazing_print"
AmazingPrint.pry!




確認


amazing-printを導入後、

Railsコンソールで動作確認。

[3] pry(main)> c = Contract.new
#<Contract:0x000055caae03f1c8> {
              :id => nil,
         :user_id => nil,
       :seller_id => nil,
          :car_id => nil,
         :plan_id => nil,
          :status => nil,
      :ordered_at => nil,
    :completed_at => nil,
     :canceled_at => nil,
      :created_at => nil,
      :updated_at => nil,
       :charge_id => nil
}

[4] pry(main)> c.save
false

[6] pry(main)> c.errors
#<ActiveModel::Errors:0x000055caae0f6940> {
              "id" => nil,
         "user_id" => nil,
       "seller_id" => nil,
          "car_id" => nil,
         "plan_id" => nil,
          "status" => nil,
      "ordered_at" => nil,
    "completed_at" => nil,
     "canceled_at" => nil,
      "created_at" => nil,
      "updated_at" => nil,
       "charge_id" => nil,
          :details => {
           :car => [
            [0] {
                :error => :blank
            }
        ],
          :plan => [
            [0] {
                :error => :blank
            }
        ],
        :seller => [
            [0] {
                :error => :blank
            }
        ],
          :user => [
            [0] {
                :error => :blank
            }
        ]
    }
}


問題なくActiveModelのerrorsが実行できるようになり、

Railsコンソールの出力もAmazingになりました。