前提・実現したいこと
プログラミング初学者です。
何卒よろしくお願い申し上げます。
現在Ruby on Rails + Docker + MySQLにてバイクレビュー投稿アプリを開発中でございます。
とても基礎的な部分なのですが、newメソッドがどうしてもNoMethodErrorとして返され、何日も四苦八苦しているのでご質問させていただきました。
レビューを投稿させる画面へ遷移するとNoMethodErrorが発生します。
レビュー投稿には
①ActiveStorageを用いた写真投稿
②ActiveHashを用いたカテゴリー選択
③Ratyを用いた星評価
を実装予定です。
わかりやすく対象のコントローラー、モデル名などをreviewに変更しております。
発生している問題・エラーメッセージ
NoMethodError in ReviewsController#new undefined method `new' for Review:Module Extracted source (around line #7): 5 6 def new 7 @review = Review.new 8 end 9
エラーログ
Started GET "/reviews/new" for 172.31.0.1 at 2021-04-01 20:02:52 +0000 Cannot render console from 172.31.0.1! Allowed networks: 127.0.0.0/127.255.255.255, ::1 Processing by ReviewsController#new as HTML Completed 500 Internal Server Error in 5ms (ActiveRecord: 0.0ms | Allocations: 2302) NameError (uninitialized constant ReviewsController::Reviews): app/controllers/reviews_controller.rb:7:in `new'
該当のソースコード
reviews_controller.rb コントローラーファイル
class ReviewsController < ApplicationController def index @user = User.new end def new @review = Review.new end end
review.rb モデルファイル
class Review < ApplicationRecord with_options presence: true do validates :bike validates :review # NOT NULLに加えて星評価を1〜5までに限定 with_options numericality: { greater_than_or_equal_to: 1, less_than_or_equal_to: 5 } do validates :recommend validates :comfort validates :fuel validates :maintenance validates :cost validates :speed validates :look end end # ActiveHashの空白保存不可を付与 with_options numericality: { other_than: 0 } do validates :displacement_id validates :maker_id validates :type_id end # アソシエーション belongs_to :user has_many :comments has_one_attached :image extend ActiveHash::Associations::ActiveRecordExtensions belongs_to :displacement belongs_to :maker belongs_to :type end
route.rb ルーティングファイル
Rails.application.routes.draw do devise_for :users root to: "reviews#index" resources :reviews, only: [:index, :new] end
/new.html.erb 新規投稿画面ビューファイル
<%= render "shared/second-header"%> <div>Hello</div> <%= render "shared/second-footer" %>
user.rb ユーザーモデルファイル(アソシエーションで紐づいているため)
class User < ApplicationRecord devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable validates :nickname, presence: true has_many :reviews has_many :comments end
comment.rb コメントモデルファイル(アソシエーションで紐づいているため)
class Comment < ApplicationRecord validates :text, presence: true belongs_to :user belongs_to :review end
試したこと
・「NoMethodError in Controller#new」といったキーワードで検索するも参考記事は見つからず。
・indexアクションにおいてUser.newは正常に動作しているため、環境上newメソッドが動かないとは考えにくい。
・ルーティングの定義に異常はないか確認したが、特に見当たらない。
・仮にnewメソッドの行をコメントアウトし、リロードすると投稿画面は表示される。(ビュー内容についてはまだ未実装)
・他のアクションでもReviewというオブジェクトでメソッドが働くか確認。
→例えばindexアクションにおいて、Review.allを実践すると、やはりNoMethodErrorが生じた。
・Reviewのインスタンスが作成できない、つまりreviewにおけるモデルファイルがもっとも怪しいと考えた。綴ミスはなし。中身をコメントアウトしてみるもエラー解消せず。
→アソシエーションの関連を疑い、userモデルファイル、commentモデルファイルのアソシエーションを確認するも異常は見当たらず。
→マイグレーションファイルと見比べても、モデルのカラム名などに不整合は見当たらず。
・各モデル(user,review,comment,displacement,maker,type)がRubyの予約語に該当するか確認→該当なし。
・ActiveHashのモデルの記述ミスを確認→異常なし
補足情報(FW/ツールのバージョンなど)
各種バージョン
ruby : 2.6.5
rails : 6.1.3
docker : 20.10.5
mysql : 5.7
閲覧いただき誠にありがとうございます。
情報不足がございましたら、遠慮なくおっしゃってください。
何かヒントでもいただけたら幸いでございます。
お時間取らせてしまい恐縮ですが、何卒よろしくお願い申し上げます。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/04/01 22:58