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

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

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

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

Ruby on Rails

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

Q&A

解決済

2回答

368閲覧

ruby on rails: view側でデータを削除したい。

rails_ruby

総合スコア87

Ruby on Rails 5

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

Ruby on Rails

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

0グッド

1クリップ

投稿2018/12/29 17:19

前提・実現したいこと

railsで簡易的なTodoリスト見たなものを作成しています。
view画面でデータを追加するところまでできました。
それで追加はできたので削除機能を実装していたら実装中に以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

undefined method `destroy' for nil:NilClass //下記でエラー @course.destroy

該当のソースコード

html

1<table> 2 <thead> 3 <tr> 4 <th>A</th> 5 <th>B</th> 6 <th>time</th> 7 </tr> 8 </thead> 9 10 <tbody> 11 <% @courses.each do |course| %> 12 <tr> 13 <td><%= course.content %></td> 14 <td> 15 <%= form_tag("/destroy") do %> 16 <input type="submit" value="delete"> 17 <% end %> 18 </td> 19 <td><%= course.created_at %></td> 20 </tr> 21 <% end %> 22 </tbody> 23</table> 24<%= form_tag("/create") do %> 25<input type="text" name="content"> 26<input type="submit" value="投稿"> 27<% end %>

ruby

1Rails.application.routes.draw do 2 get '/' => 'booking#top' 3 get '/sub' => 'booking#sub' 4 post '/create' => 'booking#create' 5 post '/destroy' => 'booking#destroy'

ruby

1class BookingController < ApplicationController 2 def top 3 @courses = Post.all.order(created_at: :asc) 4 @times = Item.all 5 @course = Post.find_by(id: params[:id]) 6 end 7 8 def create 9 @course = Post.new(content: params[:content]) 10 @course.save 11 redirect_to("/") 12 end 13 14 def destroy 15 @course = Post.find_by(id: params[:id]) 16 @course.destroy 17 18 redirect_to("/") 19 end 20end

試したこと

<%= form_tag("/destroy") do %> ```をcourse.contentまで含めて括ってみたのですが、できませんでした。 そもも、クラスが空でエラーが起きていると言っているので上記の試した子で出来るわけがないのですが、どうすればいいのか分からないので教えて頂きたいです。 ### 補足情報(FW/ツールのバージョンなど) rails5.2

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

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

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

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

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

guest

回答2

0

destroyアクションの中にも@course = Post.find_by(id: params[:id])とありますが、どれを削除するかを知るには、IDなどレコードを特定できる情報が必要です。フォームの中に<input type="hidden">を入れてidを送信する、という方法でとりあえずは乗り切れます。


なお、標準的なルーティングについては、Railsが枠組みを用意しています。resourcesを使うことで、indexnewcreateeditshowupdatedestroyの7つのアクションを一気に生成することができます。

投稿2018/12/29 23:09

maisumakun

総合スコア145183

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

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

rails_ruby

2018/12/29 23:26

@course = Post.find_by(id: params[:id])を削除した上でご教授して頂いたことを踏まえ下記のようにしたのですが、削除することが出来ませんでした。恥ずかしいながらrailsを勉強し始めたど素人なのでレコードの特定の仕方についてもう少し詳しく教えて頂けませんか? <input type="hidden" value="削除" name="id" { confirm: 'Are you sure?' }> resourcesについてはscaffoldを使うとルーティングがまとまっていて見やすかったので、resourcesについて勉強してみます。
guest

0

ベストアンサー

もう解決済みでしょうか?
下の回答も踏まえて解説させて頂きます。

エラーはこちらのコードからどのcourseを削除するのかという情報をpramsに入れて送っていないことが原因かと考えられます。

<%= form_tag("/destroy") do %> <input type="submit" value="delete"> <% end %>

これを解決するにはユーザー側のビューでは見えないtype='hidden'というものをフォームに仕込んでおきます。

具体的にはこのように書くと解決するのではないでしょうか?

<%= form_tag("/destroy") do %> <%= hidden_field_tag :id, course.id %> <input type="submit" value="delete"> <% end %>

'<%= hidden_field_tag :id, course.id %>'はビューで表示されませんがデータをparamsとしてコントローラーに送ることができます。

もしこれで解決できなければこちらが良いかもしれません。

<%= form_tag(booking_path(course.id), method: :delete) do %> <%= hidden_field_tag :id, course.id %> <%= submit_tag '削除' %> <% end %>

一行目の<%= form_tag(booking_path(course.id), method: :delete) do %>というところはあまり自信がありません^^;
ターミナルでrails routesコマンドを打って、destroyのPrefixを(プレフィックス名)_pathとなるように一行目に入れてください。
method: :deleteはそのままだとpostメソッドになるので指定が必要です。

いかがでしょうか?
それでは良いお年をお過ごしください^^

投稿2018/12/31 14:04

tailer

総合スコア62

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

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

rails_ruby

2019/01/01 07:13

年末にわざわざお時間をかけて回答して頂きありがとうございました。 解決することが出来ました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問