Techioz Blog

Ruby on Rails 6.1 へのアップグレード後の ArgumentError (引数の数が間違っています (1 が指定され、0 が期待されます))

概要

オープンソースの Ruby on Rails アプリを Rails 6.0.x から Rails 6.1.x にアップグレードしています。

アップグレードは正常に完了しましたが、RSS フィードを取得する非同期 ActiveJob からエラーが発生しました。開発中にアプリをローカルにデプロイすると、次の 1 つのエラーが発生します。

[ActiveJob] [UpdateFeedJob] [80202040-f40d-46ae-8841-94cf03afbd6c] Error performing UpdateFeedJob (Job ID: 80202040-f40d-46ae-8841-94cf03afbd6c) from Async(default) in 366.36ms: ArgumentError (wrong number of arguments (given 1, expected 0)):
/Users/matt/.rbenv/versions/2.7.6/lib/ruby/2.7.0/rss/rss.rb:53:in `w3cdtf'
/Users/matt/.rbenv/versions/2.7.6/lib/ruby/gems/2.7.0/gems/activesupport-6.1.7.3/lib/active_support/time_with_zone.rb:208:in `to_s'
...
/Users/matt/.rbenv/versions/2.7.6/lib/ruby/gems/2.7.0/gems/activerecord-6.1.7.3/lib/active_record/associations/collection_proxy.rb:348:in `create'
/Users/matt/git/haven/haven/app/jobs/update_feed_job.rb:104:in `block (2 levels) in update_feed'
/Users/matt/git/haven/haven/app/jobs/update_feed_job.rb:79:in `each'
/Users/matt/git/haven/haven/app/jobs/update_feed_job.rb:79:in `block in update_feed'
/Users/matt/.rbenv/versions/2.7.6/lib/ruby/gems/2.7.0/gems/activerecord-6.1.7.3/lib/active_record/locking/pessimistic.rb:88:in `block in with_lock'
...
/Users/matt/.rbenv/versions/2.7.6/lib/ruby/gems/2.7.0/gems/activerecord-6.1.7.3/lib/active_record/locking/pessimistic.rb:86:in `with_lock'
/Users/matt/git/haven/haven/app/jobs/update_feed_job.rb:69:in `update_feed'
/Users/matt/git/haven/haven/app/jobs/update_feed_job.rb:29:in `block in perform'
/Users/matt/.rbenv/versions/2.7.6/lib/ruby/gems/2.7.0/gems/activerecord-6.1.7.3/lib/active_record/relation/batches.rb:71:in `block (2 levels) in find_each'
...

AWS の実稼働環境にリモートでデプロイすると、少し異なるエラーが発生します。

E, [2023-04-25T06:46:06.355616 #30503] ERROR -- : [ActiveJob] [UpdateFeedJob] [2996357f-8dd2-4b97-a367-e0be19fb5a16] Error performing UpdateFeedJob (Job ID: 2996357f-8dd2-4b97-a367-e0be19fb5a16) from Async(default) in 1526.52ms: ArgumentError (wrong number of arguments (given 1, expected 0)):
/home/ubuntu/.rbenv/versions/2.7.6/lib/ruby/2.7.0/time.rb:661:in `rfc2822'
/var/www/haven/vendor/bundle/ruby/2.7.0/gems/activesupport-6.1.7.3/lib/active_support/time_with_zone.rb:208:in `to_s'
...
/var/www/haven/vendor/bundle/ruby/2.7.0/gems/activerecord-6.1.7.3/lib/active_record/associations/collection_proxy.rb:348:in `create'
/var/www/haven/app/jobs/update_feed_job.rb:104:in `block (2 levels) in update_feed'
/var/www/haven/app/jobs/update_feed_job.rb:79:in `each'
/var/www/haven/app/jobs/update_feed_job.rb:79:in `block in update_feed'
/var/www/haven/vendor/bundle/ruby/2.7.0/gems/activerecord-6.1.7.3/lib/active_record/locking/pessimistic.rb:88:in `block in with_lock'
...
/var/www/haven/vendor/bundle/ruby/2.7.0/gems/activerecord-6.1.7.3/lib/active_record/locking/pessimistic.rb:86:in `with_lock'
/var/www/haven/app/jobs/update_feed_job.rb:69:in `update_feed'
/var/www/haven/app/jobs/update_feed_job.rb:29:in `block in perform'
/var/www/haven/vendor/bundle/ruby/2.7.0/gems/activerecord-6.1.7.3/lib/active_record/relation/batches.rb:71:in `block (2 levels) in find_each'
...

Rails 6.1 では、active_support/time_with_zone.rb コードが次を呼び出します。

utc.to_s(format)

Rails 6.0 では同じものを呼び出します。

おそらく、基盤となる UTC オブジェクトのタイプが Rails 6.0 と 6.1 の間で変更されたのでしょうか?これのデバッグを開始する方法を考え中です。これは Rails 6.1 のバグのようですが、私が依存していたバグが 6.1 で修正された可能性もあります。 Ruby 2.7 から Ruby 3.0 にアップグレードしようとしましたが、問題は解決しませんでした。

次にどこを見るべきかについてのアドバイスをいただければ幸いです。

解決策

.to_formatted_s が必要で、目的の形式のシンボルを渡します

例えば

Time.current.to_formatted_s(:mysql)