はじめに
railsチュートリアルの2章でrails generate scaffoldを実行したところコマンドが返ってきませんでした。最初は私の通信環境のせいだと思っていましたが通信環境を変えても変化がなく、調べたら原因が分かったのでその解決方法をメモがてら書いていこうと思います。
具体的な内容
ubuntu:~/environment/toy_app (master) $ rails generate scaffold User name:string email:string
上記のコマンドを実行したところこの状態のまま5分以上変化がありませんでした。
原因
結論からいうと今回の問題はgemfile内にあるspringというパッケージが原因です。
このspringの役割は(以下引用)
・Rails4からデフォルトで入ったアプリケーションプリローダー
・一部のタスクを前もって実行しておき、その後に必要なタスク時間を短縮する
・アプリケーションをバックグラウンドで実行し続けてくれる
・アプリーケーションコードを編集したら内部のリロードを自動的に実行する
となっています。
今回の場合、rails generate scaffoldとspringというパッケージが競合するためコマンドがうまく実行されていなかったようです。
なのでこの問題は下記のコマンドを実行してspringの機能を止めてからrails generate scaffoldを実行することで解決します。
spring stop
springを停止させた状態で下記コマンドを実行します。(userモデル等はrailsチュートリアル2章のもの)
$ rails generate scaffold User name:string email:string
今度はちゃんと実行されました。
ubuntu:~/environment/toy_app (master) $ rails generate scaffold User name:string email:string
Running via Spring preloader in process 19734
invoke active_record
create db/migrate/20210705045655_create_users.rb
create app/models/user.rb
invoke test_unit
create test/models/user_test.rb
create test/fixtures/users.yml
invoke resource_route
route resources :users
invoke scaffold_controller
create app/controllers/users_controller.rb
invoke erb
create app/views/users
create app/views/users/index.html.erb
create app/views/users/edit.html.erb
create app/views/users/show.html.erb
create app/views/users/new.html.erb
create app/views/users/_form.html.erb
invoke test_unit
create test/controllers/users_controller_test.rb
create test/system/users_test.rb
invoke helper
create app/helpers/us_helper.rb
invoke test_unit
invoke jbuilder
create app/views/users/index.json.jbuilder
create app/views/users/show.json.jbuilder
create app/views/users/_user.json.jbuilder
invoke assets
invoke coffee
create app/assets/javascripts/users.coffee
invoke scss
create app/assets/stylesheets/users.scss
invoke scss
create app/assets/stylesheets/scaffolds.scss
まとめ
rails generate scaffoldとspringが競合した原因自体はわかりませんでしたが今回の件でエラーが起きた時には臨機応変に対応することが大切だと改めて感じました。