おもしろwebサービス開発日記

Ruby や Rails を中心に、web技術について書いています

Sorceryのメンテナになってv0.18.0をリリースした

SorceryはRails向けの認証用ライブラリです。2025年現在ではRailsで認証と言えばdeviseを思い浮かべる人が多いと思いますが、10年ほど前はもっと多様な選択肢があり、その選択肢の中にはSorceryも入っていました。

Sorceryを使う利点の一つは比較的素朴に作られているためコードが読みやすい点です。モジュールの形で認証の各機能が整理されています。これらのモジュールがモデルやコントローラにincludeされて利用されるので「この機能はどのように動いているのだろう?」と思ったときに比較的容易に振る舞いを理解することができます。

Sorceryの滞っていたメンテナンスを再開させた

そんなSorceryですがここ数年はメンテナンスが滞っており、一時期は"Sorcery is currently unmaintained"という宣言がREADMEに書かれていました。

僕自身は直接Sorceryを使っていませんが、お手伝い先が使っているのとRailsのお作法に則っていない*1のがどうしても気になるのでメンテナになって少しずつコミットを積むことにしました。

Sorceryは他のgemと違い単純にActiveSupport.on_loadを利用すると既存の振る舞いを壊してしまいます。そのため修正にはかなり大掛かりな構造変更が必要になるのではないかと考えています。場合によっては非互換な変更が避けられないかもしれません。そのためにまずは溜まっている技術負債を返済してから取り組むつもりで少しずつ活動しています。来年中にはお作法通りに動かせるといいなあ。

本当はお作法の箇所を直してからリリースしたかったのですが、だいぶ差分が大きくなってしまったのと、早くリリースしたほうがいい機能があったのでこのタイミングでv0.18.0をリリースすることにしました。

Release v0.18.0 · Sorcery/sorcery

v0.18.0のリリースにあたってリリース権限をもらったので、今後はもっと細かい単位でリリースできると思います。

主な変更点

1番大きい変更は古いRubyとRailsのサポートを切り捨ててRuby3.2以上、Rails7.1以上のサポートにしたところです。これによりRailsのバージョン分岐をするif文が減ってメンテナンスしやすくなりました。

次に大きい変更点はredirect_back_or_toのメソッド名変更です。該当PRはこちら: Add an option 'use_redirect_back_or_to_by_rails' to avoid definition conflicts of redirect_back_or_to by atolix · Pull Request #373 · Sorcery/sorcery。Sorceryはもともと「未ログイン状態でアクセスしたときのパスへログイン後にリダイレクトする」ためのメソッドとしてredirect_back_or_toメソッドを用意していましたが、Rails7.0で同名のメソッドができてしまいました。Rails版は「リファラがあったらリファラのパスにリダイレクトする」というメソッドになっており振る舞いが違います。メソッドの探索順序の都合でSorcery側が優先されるため、Rails版を使っている認識なのに実はSorcery版のredirect_back_or_toを使っていた、というケースが起こり得ます。これを防ぐためにSorcery版は別名(redirect_to_before_login_path)を用意して、Sorcery版のredirect_back_or_toを使ったら警告を出すようにしました。もしSorceryを使っているひとがいたらredirect_back_or_toを使っているところがあるかどうか確認ください。

協力のお願い

僕のSorceryを改善するモチベーションはseed-fugonの時と同様に、新しいRubyやRailsでちゃんと動くようにしたいというところが大きいです。機能追加もPRがきたら考慮しますが、自分から積極的にどうこうするというつもりは今のところないです。つまりRailsのお作法に則ったコードにするまではそれなりに僕の手は動くと思いますが、それ以降は最低限の活動になると予想されます。

恐らく日本でSorceryを使っている会社は少なからずあると思うので、興味があるひとは改善に手を貸してもらえると嬉しいです。まだまだ改善できるポイントはたくさんあります!

Sorcery/sorcery: Magical Authentication

*1:Railsのお作法に関しては以前ブログエントリにした ので詳細はこちらを参照ください

rakeタスクはconfig.rake_eager_loadを設定しないと本番環境でもeager loadしない

これはRuby/Rails Advent Calendar 2025 の 5日目の記事です。

Ruby/Rails - Qiita Advent Calendar 2025 - Qiita

次のPRで、Rails8.2でrails newしたときに生成されるconfig/environments/test.rbconfig.rake_eager_load = ENV["CI"].present?が追加されました

Fix CI eager loading when rake tasks invoke :environment before tests by trevorturk · Pull Request #56212 · rails/rails

これはなんでしょうか。というのが今日の本題です。これを説明するには前提となるところから話していかないといけません。

config.eager_loadとは

Railsにはconfig.eager_loadという設定があります。これはRailsを起動したときにすべてのアプリケーションコードを読み込むかどうかの設定です。だいたいのRailsアプリケーションにおいて開発環境ではfalse、本番環境ではtrueになっているはずです。

テスト環境においては、Rails7.0より前はデフォルトfalseでしたが、Rails7.0からENV["CI"]の有無を見てCI実行時にはeager_loadするという設定になりました*1

Enable eager loading by default on CI systems by byroot · Pull Request #43508 · rails/rails

CIでアプリケーション全体のテストを実行するときはeager loadしたほうがテストが安定するというのが主な理由です。

config.rake_eager_loadとは

一方で、rakeタスク実行時はeager_loadを無効にするという仕様がありました(Rails4.1から)。

導入されたPR: #11381: Ignore config.eager_load=true for rake by pftg · Pull Request #11389 · rails/rails 元となったIssue: Precompile tries to access the database on acceptance validation · Issue #11381 · rails/rails

元となったIssueは、「自分のアプリケーションだとrake assets:precompileでDBアクセスが発生してrakeタスクが失敗するのでそれを避けたい」というものでした。これの解決策として「rakeタスク実行時はeager loadを無効にする」が入りました。

しかしrakeタスクでeager_loadを強制的に無効にするのではなくて設定可能にしたいという人が現れconfig.rake_eager_loadが生まれました(Rails6.1から)。

[Railties] Add config rake_eager_load by tjoyal · Pull Request #28209 · rails/rails

互換性を考えてデフォルトはfalseになっています。

rakeタスクのときは常にconfig.rake_eager_loadを見る

先程Rails7.0以降はENV["CI"]の有無を見てCI実行時にはeager_load設定になったと書きましたが、これはrakeタスクには適用されていませんでした。理由はconfig.rake_eager_loadを参照する次のコードです。

rails/railties/lib/rails/application.rb at 4c53863e354ad94dbfaf0643d9cdc99393a1a583 · rails/rails

Railsアプリケーションで利用するrakeタスク内でよく使われる:environmentタスクを実行するとconfig.rake_eager_loadの値でconfig.eager_loadが上書きされてしまいます。これによりeager loadしているはずのbin/rails testがeager loadしていませんでした。

RSpecだとどうだろう?と思ったのでbin/rake経由でのRSpecを実行したのですがconfig.eager_load #=> trueだったので、恐らくRSpecユーザは(少なくともテストの実行に関しては)影響はないはず。

しかしRails標準のテスト実行時にconfig.eager_load = trueしたはずなのにeager loadされていないというのは混乱を招くので、今回その対策としてconfig.rake_eager_load = ENV["CI"].present?もconfig/environments/test.rbに追加されたというわけです。

テストに限らず本番環境でもconfig.rake_eager_loadは気をつけないといけない

ここまでCIの話をしましたが、本番環境でも同じことがおきます。config.eager_load = trueになっていてもconfig.rake_eager_load = trueにしないとrakeタスク実行時にeager loadしません。これを知らずにeager loadしている前提のrakeタスクを実行すると不具合に繋がります。

Rails Guidesにも2年ほど前に注意書きが追加されています。

Document config.rake_eager_load in the autoloading guide · rails/rails@6cbd2c9

今回導入されたPRはRails8.2でrails newしたときに反映されますが、各設定値は昔からあるものなので先んじてconfig/environments/test.rbやconfig/environments/production.rbに反映しておくと幸せになれる人がいるのではないでしょうか。

こういう話をもっと聞きたいひと

今回のエントリはお手伝い先で最近のRails情報を共有する一環で調査したものです。もっとこういう話を聞きたいぞ、というひとは 株式会社ウィルネットとして提供する技術顧問サービスについて を参照のうえお問い合わせください。

*1:Rails7.0以降でrails newしたときのconfig/environmets/test.rbがそうなるというだけなので、昔からあるRailsアプリケーションでは変わらずfalseなところも多いと思います。

gonのv6.6.0をリリースしました

gemたちをRails8.1に対応させた - おもしろwebサービス開発日記の続き。CIを頑張って整備してRails8.1でも動くことを確認したので新しいバージョンv6.6.0をリリースしておきました。テストやCI以外の修正はないのでシュッとアップグレードできるはずです。どうぞご利用ください。

Release v6.6.0 · gazay/gon

RubyWorld Conference 2025でメタプログラミングRuby問題集について登壇してきました

先日開催されたRubyWorld Conference 2025にて、「メタプログラミングRuby問題集の活用」というタイトルで kinoppydさんと一緒に登壇してきました。スライドはこちら。

SmartHR Tech Blogにてkinoppydさんも同様に登壇してきましたエントリを書いています。基本情報はそちらを参照してもらって、以下は内容が被ってない部分について書いていきます。

登壇に至るまで

もともとSmartHR Tech BlogにてメタプログラミングRuby問題集の情報については公開済みでしたが、カンファレンスなどで「作りました!」と宣言してもっと周知させたいな〜という気持ちでいました。

また、ruby.wasmでブラウザ版問題集を作る、英語版も出すというのは構想としては以前からあったのですが普段仕事に子育てにと忙しいのでなにかきっかけがあるといいな〜、と思っていました。というところでRubyWorld Conference 2025のプロポーザル募集が良いタイミングで開始されたため、プロポーザル駆動でブラウザ版が完成。

登壇は僕だけで行うこともできたのですが、問題集のきっかけとなったメタプログラミングRuby読書会を主催したkinoppydさんからも話してもらえたほうがより楽しいだろう、と思って二人で発表する形式にしてみました。

ブラウザ版の実装

ruby.wasmにおけるブラウザ版問題集の実装は、発表中に言及した通りwasmに関する部分ではほとんど詰まる所がなくスムーズに実装できました。大変だったのは問題をブラウザ用に再構成する部分。

最初は既存の問題をそのままブラウザ版として移植すればよかろう、と思っていたのですが、例えば1つの大問中に小問が6つあるのをそのままブラウザ内のテキストエリア内で解くのは体験が悪いなと思い小問ごとに問題を分けていきました。これをClaude Codeにやらせてみたのですが…単純にはいきません。「できました!」と言われて中身を見ると実はできてない、というAIエージェントあるあるをたくさん踏んでなんとか完成までこぎつけました。

ところでRubyWorld Conferenceでは他にもwasm関連の発表がありましたね。スモウルビー甲子園2025Tangible Code。ruby.wasmによってRubyの活用シーンが増えているのを感じます。

みんなもやってみてほしい

メタプログラミングRuby 第2版は、Railsアプリケーションを作るのであれば個人的に必読の本だと考えています。仕事でmethod_missingを書くことはほぼありませんが、gemのコードを読むには必須の知識です。僕はそう思って各お手伝い先にて通算10回以上読書会を開催してきました。

そんなメタプログラミングRuby 第2版を読破する人を増やすために、みなさんもぜひ読書会を実施してほしいです。これからメタプログラミングRuby読書会を主催するひとが参考にできるように、どのような形式で読書会を開催したのかを発表内容に盛り込んでいます。良ければ参考にしてみてください。

また、独自の問題を作るというのもやってみてほしいです。メタプログラミングRubyに限らず、技術書の理解を助けるための教材として問題を作るのはとても有効だと思っています。そして可能なら作った問題を公開してみてください。社外のひとにも役立つリソースになります。

もし読書会をやりたいが自分たちだけだと不安なので誰かに手伝ってほしい、という方がいたらなんらかの形で僕にお声がけください。問題づくりの方でも力になれると思います。

余談

RubyWorld Conference後に参加したRWC後に一畑電車のおでん電車でおでんを食べよう!の写真がバズってびっくりしました。こんなにいいねされたの初めて。

ginza.rb 第93回を開催してKaigi on Rails 2025の振り返りをした

Ginza.rb 第93回 - Kaigi on Rails 2025の振り返りをするぞ - connpass

第93回はKaigi on Rails 2025の振り返りをしました。

何を振り返ったか

僕含めて2人の登壇者が参加していたので、まず登壇者からの発表に関する話(どういう観点で登壇内容を決めたのかなど)をしました。

あとはみんなでこれは良い発表でしたね、というものを振り返りました。振り返った発表一覧*1

個人的にはReActionViewがとにかく圧巻だったなという印象。あとはやはりベテラン勢の発表が強かったように思います。

次回

次回は11/28(金)開催で、Rails8.1について学んでいきます。12月は開催しない予定なので年内最後のginza.rbです。忘年会を兼ねて気軽にご参加ください。

*1:開催からエントリ書くまでだいぶ間が空いているので漏れがあるかも

gemたちをRails8.1に対応させた

自分のリポジトリ配下にあるRails関連gemのCIにRails8.1を足す作業をしてバージョンアップしました。どのgemも特別な対応は不要でスッと対応できました。

修正したのはCIのみで、コード部分は変更がないのに新しいバージョンをリリースするかについて少し悩みました。しかし新しいRailsに対応しています!というのを広く周知するためにバージョンを上げてもよかろうという結論でエイヤとリリースしています。

CiLoggerのこれまでのバージョンがv0.9.1で、0.10.0のように二桁にするのはなんかアレだしいい機会なのでこの度v1.0.0にしました🎉。安定して動いていると思うのでいいんじゃないかな。

一緒に gazay/gon: Your Rails variables in your JSもRails8.1対応しようと思いましたがこれはCIが壊れていてすんなり対応できなかったので、少し時間がかかりそうです…(興味あるひとのPRをお待ちしています)。

Rails8.1のマイナーフィーチャーをまとめました

今日Rails8.1.0がリリースされましたね。めでたい。前回Rails8.0がリリースされたときはginza.rb駆動でマイナーフィーチャをまとめましたが、早くまとめたほうがお手伝い先含めてみんなでワイワイできて便利、ということで取り急ぎgistにまとめておきました。

Rails8.1のマイナーフィーチャーで気になったもの

内容は普段お手伝い先で共有しているものを整形したものになっています。間違いや「これ入れてないのおかしいでしょ」みたいなものがあったら指摘してください。

Rails8.2のメジャー/マイナーフィーチャーについていち早く知りたいひとは…?

そうですね。お近くの技術顧問にきくといいですよね。

willnet-inc/business-details: 株式会社ウィルネットとして提供する技術顧問サービスについて