`SOLID_QUEUE_IN_PUMA` の環境変数チェックを直感的な挙動に修正
config/puma.rb テンプレートで SOLID_QUEUE_IN_PUMA 環境変数を評価する際、nil・""・"false"・"0" を無効値として扱うよう修正されました。これにより、deploy.yml の設定を false に変えれば Solid Queue が無効になるという自然な期待に応えられるようになります。
背景
Rubyの真偽値ルールと環境変数の文字列型が組み合わさることで、SOLID_QUEUE_IN_PUMA: false を設定しても Solid Queue が有効のままになるという直感に反する挙動が発生していました。config/deploy.yml のデフォルト設定では SOLID_QUEUE_IN_PUMA: true が記載されており、単純に値を false に変えれば無効化できると多くの開発者が考えてしまいます。しかし、環境変数はすべて文字列として渡されるため、"false" も Rubyにとってはtruthy値であり、if ENV["SOLID_QUEUE_IN_PUMA"] は常に真になっていました。
この問題は過去にも #53340 や #56210 で取り上げられており、#56210 では「false をセットしても何も変わらない」という挙動をドキュメントで補足する方針が取られていました。しかし、コメントによる周知よりもコード自体の挙動を修正するほうが根本的な解決になると判断され、今回の変更に至っています。
技術的な変更
railties/lib/rails/generators/rails/app/templates/config/puma.rb.tt の条件式が1行変更され、明示的なfalsy値のリストを使って判定するようになりました。
変更前:
plugin :solid_queue if ENV["SOLID_QUEUE_IN_PUMA"]
変更後:
plugin :solid_queue if !["", "false", "0"].include?(ENV["SOLID_QUEUE_IN_PUMA"].to_s.downcase)
変更後の条件式では、ENV["SOLID_QUEUE_IN_PUMA"] に対して .to_s.downcase を適用することで nil も含めて文字列化・小文字統一した上で、""・"false"・"0" のいずれかに一致する場合を無効と判定します。nil.to_s は "" になるため、環境変数が未設定の場合も正しく無効として扱われます。
設計判断
falsy値を明示的にリストアップするアプローチ が採用されました。
PR内では、deploy.yml に # Comment out to disable; any value (even "false" or "") enables this. のようなインラインコメントを追加する代替案も検討されました。しかしコメントは見落とされやすく、問題の根本にあるコードの挙動そのものを修正するほうがより確実であるとして退けられています。.to_s.downcase を組み合わせることで "FALSE" や "False" といった大文字・混合ケースも無効値として扱え、環境変数の記述ゆれにも対応しています。
なお、この変更はアプリ新規生成時のテンプレートと rails app:update 実行時に適用されるものです。既存アプリに対しては自動更新はなく、rails app:update の差分として提示されます。PR本文では、"" / "false" / "0" で Solid Queue を有効化していたユーザーには影響が生じる可能性を認識しつつも、そのようなケースは極めて稀であると判断されています。
まとめ
今回の変更は1行の修正ながら、環境変数の文字列型とRubyのtruthy/falsy評価の不一致という根本的な問題を解消するものです。deploy.yml での false 設定が期待通りに機能するようになり、誤設定によるSolid Queueの意図しない起動を防げます。