<解決済み>Railsでassets:precompileを実行したところ「constant ::Fixnum is deprecated」等のエラーが出た件

f:id:boost-up:20171207230216j:plain

問題が発生した環境

  • Ruby 2.4.1
  • Rails 4.2.5

問題の内容

production環境でassets:precompileを実行したところ、大量のエラーが出力されprecompileが出来ませんでした。 エラー内容の抜粋は以下の通りです。

# bundle exec rake assets:precompile RAILS_ENV=productionn
path_to_vendor/bundle/ruby/2.4.0/gems/activesupport-4.2.5/lib/active_support/core_ext/numeric/conversions.rb:121: warning: constant ::Fixnum is deprecated
path_to_vendor/bundle/ruby/2.4.0/gems/activesupport-4.2.5/lib/active_support/core_ext/numeric/conversions.rb:121: warning: constant ::Bignum is deprecated
rake aborted!
SystemStackError: stack level too deep
path_to_vendor/bundle/ruby/2.4.0/gems/activesupport-4.2.5/lib/active_support/core_ext/numeric/conversions.rb:124:in `block (2 levels) in <class:Numeric>'
path_to_vendor/bundle/ruby/2.4.0/gems/activesupport-4.2.5/lib/active_support/core_ext/numeric/conversions.rb:131:in `block (2 levels) in <class:Numeric>'
path_to_vendor/bundle/ruby/2.4.0/gems/activesupport-4.2.5/lib/active_support/core_ext/numeric/conversions.rb:131:in `block (2 levels) in <class:Numeric>'
path_to_vendor/bundle/ruby/2.4.0/gems/activesupport-4.2.5/lib/active_support/core_ext/numeric/conversions.rb:131:in `block (2 levels) in <class:Numeric>'
path_to_vendor/bundle/ruby/2.4.0/gems/activesupport-4.2.5/lib/active_support/core_ext/numeric/conversions.rb:131:in `block (2 levels) in <class:Numeric>'
path_to_vendor/bundle/ruby/2.4.0/gems/activesupport-4.2.5/lib/active_support/core_ext/numeric/conversions.rb:131:in `block (2 levels) in <class:Numeric>'
path_to_vendor/bundle/ruby/2.4.0/gems/activesupport-4.2.5/lib/active_support/core_ext/numeric/conversions.rb:131:in `block (2 levels) in <class:Numeric>'
path_to_vendor/bundle/ruby/2.4.0/gems/activesupport-4.2.5/lib/active_support/core_ext/numeric/conversions.rb:131:in `block (2 levels) in <class:Numeric>'
path_to_vendor/bundle/ruby/2.4.0/gems/activesupport-4.2.5/lib/active_support/core_ext/numeric/conversions.rb:131:in `block (2 levels) in <class:Numeric>'
path_to_vendor/bundle/ruby/2.4.0/gems/activesupport-4.2.5/lib/active_support/core_ext/numeric/conversions.rb:131:in `block (2 levels) in <class:Numeric>'
path_to_vendor/bundle/ruby/2.4.0/gems/activesupport-4.2.5/lib/active_support/core_ext/numeric/conversions.rb:131:in `block (2 levels) in <class:Numeric>'
~ 以下、延々と同じエラーメッセージが大量に出力 ~

原因と対応の内容

ネットで調べたところ、海の向こうに同じ現象に陥った先人がいることが分かり、 チャットを読み進めていくとどうやらRuby 2.4ではFixnumとBignumはIntegerに統合され、元のクラスはなくなってしまったとのこと。 stackoverflow.com

Qiitaで解説している方がいらっしゃいました。 qiita.com

仕事としてお金を貰って他人のためのシステムを作るときには絶対にできない進め方ですが、 私の場合、開発を仕事にしているわけでもなく、自分のためのシステムを自分一人で作っているので、 新しいバージョンが出ると「とりあえず上げてみる」を結構やってしまいがちです。

運営するサービスも少しずつ大きくなってきているので、そろそろちゃんとしないとと思ってはいるのですが、早くサービスを良くしようという思いが強すぎるようです。 なので、恥ずかしながらRuby 2.4からFixnumとBignumがIntegerに統合されていたなんてことも今まで知りませんでした。 というか、FixnumとBignumというクラスすら意識して使ったことがありません。。。

話を元に戻すと、どうやらRails4.2.5のソースコードの中にFixnumとBignumを使っている箇所があることがエラーの原因らしく、 先の英語のチャットを読んでいくと、「All you have to do is upgrading Rails from 4.2.5 to Rails 4.2.8.」とのこと。

ということで、Railsを4.2.5から4.2.8に上げてみることにしました。

Gemfileのrailsのバージョン指定を次のように変更して保存し、bundle updateを実行します。

source 'https://rubygems.org'

# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '4.2.8'

その後、改めてprecompileを実行してみると、、、無事、precompileが成功するようになりました。

偉大な先人たちに日々感謝です。