Ryo.gift | Web developer blog

Web開発者のブログです。

Ruby2.7.0_Rails6.0.3.2で表示される警告の解決方法

アップグレードした話

会社でRuby on Rails(APIモード)のアップグレードを行いました。アップグレードの目的はActive Storageの機能を使ってAWS S3にデータを保管する仕組みを構築するためです。アップレードにあたっては以下のガイドや記事が参考になり、とても感謝しています。

私が担当しているシステムではRSpecを使ってユニットテストを書いていますが、Railsを5.1から6.0に上げるにあたって何度もユニットテストを実行しながら、こまめに確認することでアップグレードの作業自体は1日程度で完了させることができました。(RSpecなので並列テストの機能が使えないのが、ちょっと悲しいです。)しかし、こういう機会を経験してみて改めてユニットテストを書いておいて良かったなと思います。「テストを書く時間が無いのではなく、テストを書かないから時間が無くなるんだ」という名言は本当だなと実感しています。苦労しながらも書いた成果がありました。
さらに、Rubyのバージョンも2.5から2.7に上げることができ、新しい仕組みを使えることができるので今後が楽しみです。

Ruby2.7.0_Rails6.0.3.2で表示される警告の解決方法

さて、そういえば自宅の開発環境は古いままだったなと最近、気付いてアップグレードを行いました。そして、試しにrails newをしてみて色々と確認してみたら、初めの簡単な操作で警告が表示されるようになっていました。はい、主にRuby2.7の影響です。修正版のライブラリがRubyGems.org経由での配布に、まだ対応されていないようですので解決方法を記事にしたいと思います。

今回、試したバージョンは以下のとおりです。

Ruby on Railsのプロジェクトを新規に作成します。

$ rails new sample-app

試しにscaffoldで確認用のエンティティを作成して確認します。

$ rails g scaffold book code:string name:string

DB作成、マイグレーションを行います。

$ rails db:create
$ rails db:migrate

テストを実行します。

$ rails test

テストの実行ログに以下の警告が出力されます。

sprockets-rails-3.2.1/lib/sprockets/rails/helper.rb:355: warning: Using the last argument as keyword parameters is deprecated; maybe ** should be added to the call
sprockets-4.0.2/lib/sprockets/base.rb:118: warning: The called method `[]' is defined here

該当の箇所を確認してみます。

# sprockets-rails-3.2.1/lib/sprockets/rails/helper.rb:355
def find_asset(path, options = {})
  @env[path, options]
end

該当の「sprockets-rails」ライブラリのリポジトリを確認すると、すでに対応されています。

sprockets-rails/helper.rb at master · rails/sprockets-rails

これは、Ruby 2.7で位置引数とキーワード引数の処理方法が変更されたのが原因になります。Ruby 3へのスムーズな移行を提供することを目的とした変更のようです。しかし、以下のIssueで議論されているとおり、gemのリリースが行われていないようです。

Ruby 2.7 deprecation warning · Issue #659 · rails/sprockets

解決方法はIssueに記載されていますが、Gemfileにgithub経由でライブラリをダウンロードするように変更すると解決できます。

# Gemfile
gem "sprockets-rails", github: "rails/sprockets-rails"

ライブラリをインストールして、テストを実行すると、警告は表示されなくなりました。

$ bundle install
$ rails test
余談

2年前のRailsではWebpackerが毎回ビルドしていたのですが、最新のRailsではビルドされなくなっているのが地味に嬉しいです。以下のログが表示されるだけです。

[Webpacker] Everything's up-to-date. Nothing to do

開発体験が向上されています!OSSの文化って素晴らしいですね。何もしなくても改善され続けているなんて、とてもクールです。