LoginSignup
5
2

More than 1 year has passed since last update.

【Rails 6】環境を指定してconsoleを起動する際に詰まったポイント

Posted at

はじめに

FactoryBotの挙動を確認するために$ rails cでコンソールを起動しFactoryBot.create(:user)等のコマンドを実行してもテスト用のDBに追加されなかった。
調べると、consoleコマンドにはいくつかオプションがありそこで環境を指定できることを知った。ただ実際に環境を指定してコンソールを起動したところエラーが発生したため本記事では環境の指定方法と詰まったポイント・解決方法を記録する。

構成

1. 環境の指定してコンソールを起動する方法
2. 詰まったポイント・解決方法

実行環境

Ruby 3.0.3
Rails 6.1.4
rspec-rails 5.0.2
factory_bot_rails 6.2.0

1. 環境を指定してコンソールを起動する方法

consoleコマンド

  • consoleコマンド(cと省略可能)でコンソールを起動することでRailsアプリケーションとやり取りすることが可能。
$ rails c
Running via Spring preloader in process 261
Loading development environment (Rails 6.1.4.1)
irb(main):001:0> 
  • モデルを介してデータをDBに保存したり、定義したメソッドの挙動の確認したりする際に使用される。
irb(main):001:0> Article.create(title: "タイトル1", content: "内容1")
  • 内部にirbが組み込まれているため、Rubyのコードを実行することが可能。
  • Railsアプリケーションの環境を読み込んだ上でコードを実行することが可能

環境を指定する

Railsには以下3つの環境が用意されている

  • develop: 開発環境
  • test: テスト環境
  • production: 本番環境

Rails5までは$ rails c [環境]で環境を指定することで対象環境でコンソールを起動することができる。

# テスト環境でコンソールを起動する場合
$ rails c test

# 本番環境でコンソールを起動する場合
$ rails c production

Rails6以降では上記の方法だとエラーが発生するため以下いずれかの方法で起動する

  • RAILS_ENV=[環境] rails c
  • rails c --environment [環境]
  • rails c -e [環境]
# テスト環境でコンソールを起動する場合
$ rails c -e test

デフォルトでは開発環境が指定されている

デフォルトでは開発環境に設定されているため何も指定せずに起動した場合は開発環境でコンソールが起動する.

$ rails c
Running via Spring preloader in process 71
Loading development environment (Rails 6.1.4.1)
irb(main):001:0> Rails.env
=> "development"

2. 詰まったポイント・解決方法

test環境でコンソールを起動したいため、以下コマンドを実行すると,エラーが発生した。

$ rails c -e test
/usr/local/bundle/gems/spring-3.1.1/lib/spring/application.rb:101:in `block in preload': Spring reloads, and therefore needs the application to have reloading enabled.
Please, set config.cache_classes to false in config/environments/test.rb.

1. メッセージを見てみる
springはreloadを行うので、アプリケーション側でreloadを有効にする必要がある。」
config/environments/test.rbに記載されているconfig.cache_classesfalseに設定してください」

2. springとは何だ
gemの一つで、Railsアプリケーションをバックグラウンドで起動させたままにしておく事でrailsコマンドを実行する度にRailsを起動しないで済むため開発の効率向上を実現できる。

3. config/environments/test.rbconfig.cache_classesを見てみる

config/environments/test.rb
Rails.application.configure do
  ...
  config.cache_classes = true
  ...
end

現状では、なぜだかtrueとなっており、キャッシュを使用する(リクエストごとにアプリケーションのクラスやモジュールをreloadしない)設定になっている。

※ Rails6以降のconfig.cache_classesのデフォルト値は以下のとおり
(参考: https://madogiwa0124.hatenablog.com/entry/2019/09/16/145657)

  • development: false
  • test: springがインストール済み ->false, 未インストール -> true
  • production: true

4. falseに変更し、再度実行してみる

config/environments/test.rb
Rails.application.configure do
  ...
  config.cache_classes = false
  ...
end
$ rails c -e test
Running via Spring preloader in process 246
Loading test environment (Rails 6.1.4.1)
irb(main):001:0> FactoryBot.create(:user)
  TRANSACTION (2.0ms)  BEGIN
  ...

test環境でコンソールが起動されて、FactoryBot.create(:user)を実行することでテスト用のDBに正しくファクトリが保存された。

参考

5
2
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
5
2