Rails の状況について振り返り2023年

静岡でフリーランスでWeb開発をしているkazuomatzです。

[静岡 Advent Calendar 2019](https://qiita.com/advent-calendar/2019/shizuoka)の２日目に[「Rails10年選手がGoの勉強会に参戦してきた」](https://qiita.com/kazuomatz/items/ce44c92d2e90a96e9380)というエントリーを投稿して、あれから４年が過ぎました。

Goやるといいいつつ、この４年間でGoの成果物は全くなく、あいかわらずRailsを使っていろいろなWebサービスを開発しています。

当時、Ruby/Railsの状況については、このように書いていました。

## 2019年当時のRuby / Railsの状況

- 2〜3年前に開発したWebサービスがサポート外のRailsで動いている
- とはいえ、Railsのバージョンアップする時間・費用がない
- 慣れ親しんだライブラリーが更新されず、最新のRails環境で使えない

2019年といえば、当時の安定バージョンはRails 5.2系で、Rails 6もリリースされて、そろそろRails 6で作ろうかと言っていた頃だと思います。

5.2系は、ActiveStorageが実装されて、PaperClipが使えなくなったバージョンとしてRails開発者の中では思い出深いバージョンです。そのせいか自分の保守リストには、5.2系の Railsのシステムがなかったりします。

４年経過した今はどうでしょうか？

## 2023年現在のRuby / Railsの状況

- <b>6〜7</b>年前に開発したWebサービスがサポート外のRailsで動いている
- とはいえ、Railsのバージョンアップする時間・費用がない
- 慣れ親しんだライブラリーが更新されず、最新のRails環境で使えない


６〜７年前といえば、Railsのバージョンは4.2系だったと思いますが、2023年現在、Rails 4 / 5 / 6 で開発されたサービスを保守しながから、Rails 7で新しいサービスを開発してたりします。

個人的には、この４年間で開発するものの基本要件としてはあまり変わらないのですが、最低限以下のようなことをRailsで実現するための知識や道具を用意しています。

- 位置情報を扱う
- 写真や画像をサーバーサイドで加工する
- Web API接続でのWebアプリを作る

これらについて、この４年間で変わったことをまとめてみます。


## 位置情報について

Gogle Mapを使うWebアプリを開発したり、GISっぽいシステムを開発する場合にGeo系のライブラリーを使います。
[こちらの記事](https://qiita.com/kazuomatz/items/884c7b5e64a3b7532204)に詳しいのですが、Rails + MySQLの組み合わせでよく使われるライブラリーとして[activerecord-mysql2spatial-adapter](https://github.com/rgeo/activerecord-mysql2spatial-adapter)というGemがありました。

こちらのGemは本家のGitHubのリポジトリでは、Rails4.1対応版を最後に開発が止まっており、その後のRailsのバージョンでは、有志の人が手を入れたものをインストールするといった形で対応してきました。僕もRails6.0で動作するよう[対応したりしました](https://qiita.com/kazuomatz/items/884c7b5e64a3b7532204)。

Rails 7で開発するタイミングでactiverecord-mysql2spatial-adapterを使うのは止めにして、クックパッドさんが開発している[armg](https://github.com/cookpad/armg)を使っています。

## 画像の扱いについて

画像の扱いについては、前にも書いたとおり、Rails 5.2からActiveStorageが実装されて、これまで写真のアップロードのライブリーの定番であった[PaperClip](https://github.com/thoughtbot/paperclip)が使えなくなったことが大きいです。

ActiveStorageは最初は使いづらかったのですが、バージョンを重ねるにつれて使いやすくなり、今はとても便利に使えています。

2019年に[Active StorageのVariantの指定方法いろいろ](https://qiita.com/kazuomatz/items/3cdbd2c40576c2e9d89b) という記事を書きましたが、今でも「ActiveStorage Variant」で検索すると検索上位にくる記事となっています。

去年くらいにやった試みとしては、ActiveStorageを使って、必要に応じて画像をWebPに変換して配信する仕組みを作ったりしました。

ActiveStorageは画像を扱うライブラリを切り替えることもできますね。昔からの名残でこれまでずっとImageMagickをラップしたRMagickやminiMagickを使っていますが、高速でメモリ使用量が少ない[Vips](https://www.libvips.org)を使うことができます。まだ試せていないので、来年には試してみたいと思っています。


## Web API接続でのWebアプリを作る

これはどちらかと言うとフロントエンドの話ですね。
Rails 5まではSprocketsによってJavascriptやCSSを管理・圧縮・結合して配信されていましたが、Rails6から登場したWebpacker(webpackではない）でフロントエンドのアセットを管理するようになりました。
名前が似ていますが。WebpackerはwebpackをRailsで使えるようラップしたものです。
webpack.config.jsを書くところを、webpack.ymlで定義するなど、Railsの世界でwebpackを構築できる仕組みなのですが、今ひとつ評判がよくなかったですね。

Webpackerでググると「もしかしてwebpack?」 となってしまったり。
あえてWebpackerを使わずに、普通にwebpackを使ったりしていました。

Rails 7では、Webpackerは切り捨てられ、フロントエンドは好きなモノ使ってねのスタンスに変わりました。
僕は、webpackを使っていますが、[jsbundling-rails](https://github.com/rails/jsbundling-rails/)や、[Tailwind CSS](https://tailwindcss.com)などを組み込んで使うことができます。この辺りも試してみたいとは思います。

そんな中webpackも開発が止まってしまったので、来年はwebpackの後継の[Turbopack](https://github.com/vercel/turbo)や[Vite](https://ja.vitejs.dev)あたりを触らないとならないかなと思っています。

いずれにせよ、一度乗ったRailにはずっと乗っているだろうなと思います。

どうしても目の前の案件ファーストになってしまいがちで、なかなか新しいモノを触る時間が減っているので、来年こそはいろいろ見直しつつ、楽しいRails Lifeを送りたいですね。