Rails 7.1: Rails.env.local?で環境がdevelpment/testかどうかをチェック(翻訳)
Rails 7.1で新メソッドRails.env.local?
が導入されました(#46786)。このメソッドは、環境がdevelopmentまたはtestの場合にtrue
を返します。development環境やtest環境でのみ実行したいコードがある場合に便利です。
🔗 改修前
Railsアプリケーションのdevelopment環境やtest環境でのみ動かしたいコードパスはいろいろあります。Railsにはdevelopment、test、staging、productionに加えて、マルチプルstaging環境やアプリケーションレビュー環境といったさまざまな環境がある場合もあります。
そのような場合、たとえば以下のようにコードで環境名をチェックする必要が生じます。
unless Rails.env.development? || Rails.env.test?
# 外部APIを呼び出す
ExternalAPI.call
end
または
if Rails.env.development? || Rails.env.test?
# development/test環境用のテストデータを作成する
end
🔗 改修後
Rails.env.local?
メソッドが導入されたおかげで、上のコードを以下のように書けます。
unless Rails.env.local?
# 外部APIを呼び出す
ExternalAPI.call
end
または
if Rails.env.local?
# development/test環境用のテストデータを作成する
end
🔗 IRB/Railsコンソールのオートコンプリート無効化
Rails 7.1では、production環境のRailsコンソールでオートコンプリートをデフォルトで無効にする機能も導入されました(#46656)。
この機能は、大規模なRailsアプリケーションでオートコンプリートが遅くなる場合(特にコンソールにリモート接続している場合)に便利です。
従来のproduction環境では、Rails.env.production?
チェックによってオートコンプリートが無効になっていました。
しかしこれでは、stagingなど他の環境では引き続きオートコンプリートが有効になり、動作が遅くなったり問題が生じたりすることになります。
#47818によって、development環境またはtest環境であるかどうかが新しいRails.env.local?
メソッドでチェックされるようになり、それ以外の場合はデフォルトでオートコンプリートが無効になるように変更されました。
🔗 まとめ
Rails.env.local?
はRails.env.development? || Rails.env.test?
チェックのショートハンドであり、development環境やtest環境でのみ動かしたいコードがある場合に有用です。
訳注
Rails 7.1リリース後に以下のツイートを見つけました。
One small Rails 7.1 upgrade hiccup - if you're using the new Rails.env.local? method and Rubocop, you will need to set custom environments in your Rubocop config: pic.twitter.com/rHqcbi4UFs
— Matt Solt (@mattsolt) October 6, 2023
関連記事
Rails 7: ActionController::Parameters.to_hにブロックを渡せるようになった(翻訳)
概要
元サイトの許諾を得て翻訳・公開いたします。
参考: 週刊Railsウォッチ20230125:
Rails.env.local?
でdevelopmentとtestの環境変数をまとめて扱えるようになった参考: 週刊Railsウォッチ20230131:
Rails.env.local?
を最適化