文系卒のWebエンジニアの成長と備忘録
エンジニア経験を生かして発信するメディアサイト

【Ruby on Rails】rails g コマンドが反応しない時の対処法

Group of people holding question mark icons

こんにちはYsです。
Railsを使用した自作の開発も段々と落ち着いてきました。

それはそうとして、開発の過程の中で起こった事象があったのでこれを書いていきます。
上記のタイトル通りの事象として、対処法のみ知りたい方は、3.対処法を確認するだけで大丈夫だと思います。

  1. 概要
  2. 原因
  3. 対処法

概要:rails g コマンドが反応しない

Ruby on RailではControllerやModelを新規で作成する際に、コマンドから簡単に作成することが出来ます。
その際にrails g または、rails generateというコマンドをターミナル上で実行します。

しかし、実行してもこの上記のコマンドから応答がなく、強制終了(Ctrl + C)を行うと以下のようなエラーが出力されます。

$ rails g model Post message:text
Traceback (most recent call last):
        16: from bin/rails:3:in `<main>'
        15: from bin/rails:3:in `load'
        14: from /Users/Project/bin/spring:15:in `<top (required)>'
        13: from /Users/.rbenv/versions/2.5.0/lib/ruby/2.5.0/rubygems/core_ext/kernel_require.rb:70:in `require'
        12: from /Users/.rbenv/versions/2.5.0/lib/ruby/2.5.0/rubygems/core_ext/kernel_require.rb:70:in `require'
        11: from /Users/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/spring-2.0.2/lib/spring/binstub.rb:31:in `<top (required)>'
        10: from /Users/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/spring-2.0.2/lib/spring/binstub.rb:31:in `load'
         9: from /Users/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/spring-2.0.2/bin/spring:49:in `<top (required)>'
         8: from /Users/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/spring-2.0.2/lib/spring/client.rb:30:in `run'
         7: from /Users/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/spring-2.0.2/lib/spring/client/command.rb:7:in `call'
         6: from /Users/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/spring-2.0.2/lib/spring/client/rails.rb:24:in `call'
         5: from /Users/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/spring-2.0.2/lib/spring/client/command.rb:7:in `call'
         4: from /Users/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/spring-2.0.2/lib/spring/client/run.rb:35:in `call'
         3: from /Users/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/spring-2.0.2/lib/spring/client/run.rb:42:in `warm_run'
         2: from /Users/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/spring-2.0.2/lib/spring/client/run.rb:62:in `run'
         1: from /Users/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/spring-2.0.2/lib/spring/client/run.rb:117:in `verify_server_version'
/Users/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/spring-2.0.2/lib/spring/client/run.rb:117:in `gets': Interrupt

本来であれば、以下のように生成が完了したcreateというログが出力されるはずです。
一体何が原因なのか、次で書いていきます。

$ rails g model Post message:text
      invoke  active_record
      create    db/migrate/20190216023538_create_posts.rb
      create    app/models/post.rb
      invoke    test_unit
      create      test/models/post_test.rb
      create      test/fixtures/posts.yml

原因:rails g コマンドが反応しない

このコマンドの反応がない原因としては先ほどログで大量に出ていた部分。
/lib/ruby/gems/2.5.0/gems/spring-2.0.2/lib/spring/に原因がありました。
gems/ のファイルなのでパッケージ「spring」というものが原因です。

gem springとは?

  • Rails4からデフォルトで入ったアプリケーションプリローダー
  • 一部のタスクを前もって実行しておき、その後に必要なタスク時間を短縮する
  • アプリケーションをバックグラウンドで実行し続けてくれる
  • アプリーケーションコードを編集したら内部のリロードを自動的に実行する

という感じが公式の部分に書いてあります。

超アバウトですが、主に開発をする上で開発者に余計なタイムロスを発生させないようにするためのパッケージです。

このパッケージが内部で実行し続けているため、自分の実行しているコマンドと命令が競合してしまい、うまく成功しなかったようです。

次にこの対処法を書いていきます。

対処法:rails g コマンドが反応しない

下記のコマンドを実行し、バックグラウンド側で動いているSpringを止めてしまいます。
spring stopというコマンドを実行したあと、以下のような出力になっていればOKです。

$ spring stop
Spring stopped.

これで再度、rails g コマンドを実行します。

$ rails g model Post message:text
      invoke  active_record
      create    db/migrate/20190216023538_create_posts.rb
      create    app/models/post.rb
      invoke    test_unit
      create      test/models/post_test.rb
      create      test/fixtures/posts.yml

正しく、createがされていることが確認出来ました。


エラーの原因について書きました。
正しく、アプリケーションの終了が行われないと上記のような事象になるみたいです。

自分で作成している簡単なアプリだけでも結構エラーとして出力されるので勉強としてこの経験を生かしたいと思います。

また、開発過程で何かあったら更新します。

Reference

Related article

\記事のシェアをお願いします!/