【エラー】NoMethdError in Tasks#new【インスタンスを生成していなかった】
皆様、こんにちわ。
U_OK_2023 です。
本日も、朝から就活のために求人を探したり、
メールや通知の対応をしておりました。
その合間に、オリジナルアプリの続きをしております。
内容は、タスク投稿機能です。
早速、
エラー発生
ルーティングを設定し、コントローラーを記述し、対応するビューを作成。
ビューが表示されるか確認するために、
localhost:3000/tasks/new へアクセスしたところでエラーが発生
①何が問題でどうしたい
エラーを解決し、tasks/new ページを表示させたい
②現在(位置)
MVCにおけるV
③問題点
モデル が nil であるということ
④仮説
undefined method `errors' for nil:NilClass というエラーメッセージより、
値が空のためerrorsメソッドが実行できないということ。
今回のエラー箇所は <% if model.errors.any? %> の部分(ビュー(部分テンプレート)であり、 errorsメソッドの実行には、model に 値が設定されている必要がある。
model とテータのやり取りをしているのはコントローラーである。
newアクションを実行する場合、コントローラー内で、
初期化されている必要があるため、
@task = Task.new (初期化) が コントローラー で設定されているか確認する
⑤試したこと
1️⃣場所(存在するのか) 場所の確認
(そもそも見つからないと言われているものは存在するのか)
@task = Task.new の設定は app/controllers/tasks_controller.rb に設定するため 確認
→ 場所はある
2️⃣前提&置換((構文的に)正しく設定されているか)
前提の確認(記述の仕方は(構文的に)正しいか))
正しい構文で、値は正しく置き換わっているか
app/controllers/tasks_controller.rb に @task = Task.new の記述はなかった
⑥結果
記述を追加し、エラーを解決することができた
app/controllers/tasks_controller.rb
class TasksController < ApplicationController before_action :authenticate_user!, only: [:new] def index end def new @task = Task.new end end
原因:
@taskインスタンスを生成していなかったため
解決方法:
@task = Task.new を追加
気付き:
MVCの流れを意識することでエラーの根幹に辿り着きやすくなってきた。
ルーティング → コントローラー → モデル → ビュー の流れ。
今回は、ビューでエラーが発生したため、
その一つ前の モデルに着目することで、
エラー解決の糸口を掴むことができました。
今回のエラーは、エラーを解決するための手順の基本になるなと感じました。
処理の流れや、値の生成、受け渡し を より理解できました。