こんにちは、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が動かない】
Ruby 2.6.7
Rails 6.1.3.1
Railsコンソールの出力を見やすくするために
gem 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
解決策
どうするか?
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になりました。