LoginSignup
0
0

More than 3 years have passed since last update.

【Rails】envメゾッドで開発、本番、テスト環境での挙動をわける方法

Posted at

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の方が読み込まれてしまい修正した経緯があります。
(いずれもほぼ同じ意味という認識で実行したのですが、、)
もし原因分かる方がいらっしゃいましたらご教示いただけますと幸いです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0