U_OK_2023’s blog

主に日々のプログラミング学習についてのアウトプットと備忘録

【エラー】NoMethdError in Tasks#new【インスタンスを生成していなかった】

皆様、こんにちわ。

U_OK_2023 です。

本日も、朝から就活のために求人を探したり、
メールや通知の対応をしておりました。

その合間に、オリジナルアプリの続きをしております。
内容は、タスク投稿機能です。

 

早速、

エラー発生

ルーティングを設定し、コントローラーを記述し、対応するビューを作成。
ビューが表示されるか確認するために、 
localhost:3000/tasks/new へアクセスしたところでエラーが発生

https://i.gyazo.com/58f115928a02ebc1ae0fafd6ae076274.png

①何が問題でどうしたい

エラーを解決し、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の流れを意識することでエラーの根幹に辿り着きやすくなってきた。
ルーティング → コントローラー → モデル → ビュー の流れ。
今回は、ビューでエラーが発生したため、
その一つ前の モデルに着目することで、
エラー解決の糸口を掴むことができました。

 

今回のエラーは、エラーを解決するための手順の基本になるなと感じました。
処理の流れや、値の生成、受け渡し を より理解できました。