Railsで用意されているenv
- produciton(本番環境)
- test(テスト環境)
- development(開発環境)
実装例
Rails.env.development?と記述すれば開発環境の場合の処理を記載できます。
例えば、例外処理で下記のような記述を行った場合は、開発環境以外でのみ読み込まれる。
参考:Rails 5の404/500エラーページ、簡単作成手順
controller/application
#開発環境ではない場合に読み込む
unless Rails.env.development?
rescue_from ActiveRecord::RecordNotFound, with: :render_404
rescue_from ActionController::RoutingError, with: :render_404
rescue_from Exception, with: :render_500
end
しかし、このままだと、本番環境のみでなく、テスト環境でも読み込まれるため、
RSpec等実行する際のエラー文を読み込めない場合があります。
下記のような記述にすれば解決。
controller/application
#開発環境またはテスト環境ではない場合に読み込む
unless Rails.env.development? || Rails.env.test?
rescue_from ActiveRecord::RecordNotFound, with: :render_404
rescue_from ActionController::RoutingError, with: :render_404
rescue_from Exception, with: :render_500
end
同じ要領で下記のように使うことも可能。
controller/hoges_controller
# 本番環境で使っているMySQLではRANDOMが使えずRANDが必須
if Rails.env.development? || Rails.env.test?
# SQLite(開発、テスト環境ではRANDOM)
@hoges = Answer.order("RANDOM()").limit(3)
else
# mySQL対応(本番環境ではRAND)
@hoges = Answer.order("RAND()").limit(3)
end
さいごに
RANDOMの例で記載した、unless Rails.env.development? || Rails.env.test?
という記述は、元々if Rails.env.production? とelse記述していたところ、
本番環境でもdevelopmentの方が読み込まれてしまい修正した経緯があります。
(いずれもほぼ同じ意味という認識で実行したのですが、、)
もし原因分かる方がいらっしゃいましたらご教示いただけますと幸いです。