
こんにちは、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_dumpsince 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になりました。