質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

2235閲覧

NoMethodError in Tasks#indexが解決できない。

-maeji-

総合スコア39

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

1クリップ

投稿2019/01/11 09:07

編集2019/01/12 05:26

現在CRUD処理を実行できるアプリケーションを作成し練習しています。(タスク管理)
CRUD作成でここまでなんとか進めることができたのですが、destroy削除機能が実装できず、エラーが表示されます。

イメージ説明

$ rails routesでルートの一覧を確認し、
DELETE /tasks/:id(.:format) tasks#destroy
これに沿った内容を調べて編集したつもりなのですが、抜け出せないでいます。編集したファイル内容は以下のとうりです。
一緒にみてもらえないでしょうか。お願いいたします。

:追記1

undefined method `id' for nil:NilClassとありますが、nilとは何もないよ。という意味と記憶しています。
idはここでは登録されたタスクだと認識していますが、前に新規登録されたものが保存されています。(今はクリエイトするとエラーが起きるが編集画面で確認できる)

:追記2

$ rails cでparamsを実行すると
pry(main)> params NameError: undefined local variable or method `params' for main:Object from (pry):9:in `__pry__'
と出力される

##routes.rb

rb

1Rails.application.routes.draw do 2 # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html 3 resources :tasks 4 root to: 'tasks#index' 5end

##tasks_controller.rb

rb

1class TasksController < ApplicationController 2 def index 3 @tasks = Task.all 4 end 5 6 def new 7 @task = Task.new 8 end 9 10 def edit 11 @task = Task.find(params[:id]) 12 end 13 14 15 def create 16 @task = Task.new(tasks_param) 17 #@task = Task.new(title: params[:task][:title], content: params[:task][:content]) 18 19 if @task.save 20 redirect_to tasks_url 21 else 22 render :new 23 end 24 end 25 26 27 def update 28 @task = Task.find(params[:id]) 29 if @task.update(tasks_param) 30 redirect_to tasks_path 31 else 32 render :edit 33 end 34 end 35 36 37 def destroy 38  @task = Task.find(params[:id]) 39  @task.destroy! 40 redirect_to tasks_path 41 end 42 43 private 44 def tasks_param 45 params.require(:task).permit(:title, :content) 46 end 47end

##index.html.erb

rb

1<h1>タスク一覧</h1> 2<ul> 3 4 <% @tasks.each do |task| %> 5 <li> 6 title: <%= task.title %> 7 </li> 8 9 <li> 10 content: <%= task.content %> 11 </li> 12 13<!-- /tasks/:id(.:format) --> 14 <%= link_to '削除', task_path(@task.id), 15 method: :delete, data: { confirm: "削除してよろしいですか?", commit: "削除する", cancel: "やめる", title: "ご確認ください" } %> 16 <% end %> 17 18 19</ul>

:追記
イメージ説明

イメージ説明

tasks_controller.rb

rb

1class TasksController < ApplicationController 2 def index 3 @tasks = Task.all 4 end 5 6 def new 7 @task = Task.new 8 end 9 10 def edit 11 @task = Task.find(params[:id]) 12 end 13 14 15 def create 16 @task = Task.new(tasks_param) 17 #@task = Task.new(title: params[:task][:title], content: params[:task][:content]) 18 19 if @task.save 20 redirect_to tasks_url 21 else 22 render :new 23 end 24 end 25 26 27 def update 28 @task = Task.find(params[:id]) 29 if @task.update(tasks_param) 30 redirect_to tasks_path 31 else 32 render :edit 33 end 34 end 35 36 37 def destroy 38  @task = Task.find(params[:id]) 39  @task.destroy! 40 redirect_to tasks_path 41 end 42 43 private 44 def tasks_param 45 params.require(:task).permit(:title, :content) 46 end 47end

index.html.erb

rb

1<h1>タスク一覧</h1> 2<ul> 3 4 <% @tasks.each do |task| %> 5 <li> 6 title: <%= task.title %> 7 </li> 8 9 <li> 10 content: <%= task.content %> 11 </li> 12 13 14 <%= link_to '削除', task_path(task.id), 15 method: :delete, data: { confirm: "削除してよろしいですか?", commit: "削除する", cancel: "やめる", title: "ご確認ください" } %> 16 <% end %> 17 18 19</ul>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

@taskではなく、taskの間違いでしょう

投稿2019/01/11 09:57

asm

総合スコア15147

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

-maeji-

2019/01/11 11:56

ありがとうございます。 ご指摘の``@task``を``task``にしたら、一覧画面に表示されました。 まだ把握できていないのが、なぜ@taskではなく、taskなのか、です。 コントローラーでは例えば、 def destroy  @task = Task.find(params[:id])  @task.destroy! redirect_to tasks_path end @taskの中のidをみているので、@taskとしてしまいました。 link_to以下の書き方とインスタンス変数について理解できていませんでした。 ありがとうございました。
-maeji-

2019/01/11 12:05

度々すいません。 一覧画面に飛べるのですが、削除を実行すると、今度はコントローラーの画面でエラーが表示されてしまいました。こちらも@taskが原因でしょうか。 :エラーを追記いたしました。
asm

2019/01/11 15:29

> まだ把握できていないのが、なぜ@taskではなく、taskなのか、です。 index.html.erbなので TasksController#indexメソッドなので@taskはありません。 > 削除を実行すると、今度はコントローラーの画面でエラーが表示され destroy!の!が全角記号になっているので半角に直してください
-maeji-

2019/01/12 05:23

なんどもすいません。 !に修正いたしました。 すると今度はその上の行でundefined method と言われてしまいました。 別のアプリケーションを真似て書いているのですが、どこが間違っているのかわからないです。 <%= link_to '削除', task_path(task.id), method: :delete, data: { confirm: "削除してよろしいですか?", commit: "削除する", cancel: "やめる", title: "ご確認ください" } %> ここで何か間違えてしまっているでしょうか? :エラーを追記しました。何度も申し訳ありません。 よろしければ一緒にみてもらえたらと思います。よろしくお願いします。
asm

2019/01/12 06:16

> def destroy >  @task = Task.find(params[:id]) >  @task.destroy! この部分の@taskの前に全角空白が混じっています。 プログラミング時には全角空白を表示させる設定のあるエディタを使う事をオススメします vscode + https://marketplace.visualstudio.com/items?itemName=mosapride.zenkaku とか
-maeji-

2019/01/12 06:30

ありがとうございます! 全角が入ってしまうと、文字として認識してしまうのでしょうか。 ひとまず削除機能が実装できたのかなと思います。 @taskのことも自分の中で理解が少し進んだように思います。 エディタのことと合わせて日付をまたいでありがとうございました。 また何かあったらお願いできたらと思います。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問