rails server でちゃんと終了できていなかった時のこと。
エラー:
NameError in BooksController#show uninitialized constant Book::PictureUploader Extracted source (around line #2): 1 2 3 class Book < ApplicationRecord mount_uploader :picture, PictureUploader end Rails.root: /Users/myMBP/work/sandbox/my_web_apps/books_app Application Trace | Framework Trace | Full Trace app/models/book.rb:2:in `<class:Book>' app/models/book.rb:1:in `<main>' app/controllers/books_controller.rb:62:in `set_book' Request Parameters:
uninitialized constant とは
エラー内容:
qiita.com
> Book::PictureUploader
を定義していない旨のエラーが出ていました。
ただし、本を写経していたので、タイポでも無い限り間違いであるはずがないと確信していたので、どうしたものかと悩んでいました。
※本自体は、他の受講生が多数クリアしていたので。
エラー名で検索してみる
下記の様に命名規則違反でも、当エラーが発生するようです。
【Rails】uninitialized constant UsersController というエラーが出たときの対処法 | FREE SWORDER
またジャストのエラー文言かぶりでしたが、こちらでも解消せず。
Railsチュートリアル中にNameError: uninitialized constant Micropost::PictureUploaderが出た時の対処法 - Qiita
spring stop
spring ってなんなんだ
> Spring は Rails アプリケーションの preloader(プリローダー)の gem です。Rails アプリケーションをバックグラウンドで走らせたままにしておくことにより(pre + load = 前もってロードしておく)、bin/rails や bin/rake コマンドの2回目以降の起動時間が短縮されます。
原因
そもそもサーバー起動時に、下記画像の文言が出ており、
サーバーの停止がうまくいっていなかった模様。
そこでサーバー停止について、調べる。
> cat tmp/pids/server.pid
そして、killしてから立ち上げてみる。
成功!
じゃあ、なんでサーバー起動が正常でない時のエラーがモデルについてのエラーなのか
uninitialized constant とは何なのかに立ち返る。
> クラスの読み込みが上手くいっていない。
rubyファイルを実行した時にrails sした直後は実行時点でクラスを読み込んでいないので、app/models/user.rbファイルを探しにいく。
app/models/user.rbというファイルがあれば、ファイルをオープンしてクラスを読み込む
しかし、app/models/user.rbというファイルがない、ファイルの中にUserというクラスが定義されていない場合、uninitializedエラーが起きる
ここでいう、user.rbが、book.rbである。
Railsには、標準でPumaというWebサーバが付随しています。
サーバーからアクセスするも→book.rbが読み込めない→ファイルの定義間違えてない?というエラーになる。
参考記事:
サーバー立ち上げの時の文言をしっかり見ていたら、
ここにたどり着けたはず。いつも勉強になります。
しっかりエラーハンドリングまで載っているサイト。
大変参考になります。