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

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

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

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

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

Q&A

解決済

2回答

1785閲覧

rails コメントの削除機能

taixnihsi

総合スコア4

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

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

0グッド

0クリップ

投稿2020/05/17 13:31

前提・実現したいこと

コメント機能の削除

railsで簡単な大喜利サイト製作中です。
themes(お題)コントローラーに対してアソシエーションを利用してanswer(回答機能)を作ったのですが、回答の削除機能製作中に、destroyに対する引数の設定でエラーがおきました

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

Couldn't find Answer with 'id'=2 [WHERE "answers"."theme_id" = ?]
Extracted source (around line #20):
18
19
20
21
22
23

def destroy
@theme = Theme.find(params[:theme_id])
@answer = @theme.answers.find(params[:id])
@answer.destroy
redirect_back(fallback_location: root_path)
end

該当のソースコード

answerscontroller

1 class AnswersController < ApplicationController 2 before_action :authenticate_user! 3 4 def create 5 # @answer = Answer.new(answer_params) 6 theme = Theme.find(params[:theme_id]) 7 @answer = theme.answers.build(answer_params) 8 @answer.user_id = current_user.id 9 if @answer.save 10 flash[:success] = "コメントしました" 11 redirect_back(fallback_location: root_path) 12 else 13 flash[:success] = "コメントできませんでした" 14 redirect_back(fallback_location: root_path) 15 end 16 end 17 18 def destroy 19 @theme = Theme.find(params[:theme_id]) 20 @answer = @theme.answers.find(params[:id]) 21 @answer.destroy 22 redirect_back(fallback_location: root_path) 23 end 24 25 private 26 27 def answer_params 28 params.require(:answer).permit(:answer) 29 end 30end 31

themescontroller

1def show 2 @theme = Theme.find(params[:id]) 3 @answers = @theme.answers 4 @answer = @theme.answers.build 5 end 6 7

showhtmlerb

1 2 3<% @answers.each do |a| %> 4 <div> 5 <%= a.user.email unless a.user.blank? %> 6 <br> 7 <%= a.answer %> 8 <%= link_to "削除",theme_answer_path(a.theme_id,a.id),method: :delete %> 9 10 </div> 11 <br> 12 <% end %>

answerrb

1class Answer < ApplicationRecord 2 belongs_to :user 3 belongs_to :theme 4 end

themerb

1class Theme < ApplicationRecord 2 mount_uploader :image, ImageUploader 3 belongs_to :user 4 has_many :answers ,dependent: :destroy 5end 6 7

railsroutes

1theme_answer DELETE /themes/:theme_id/answers/:id(.:format) answers#destroy 2

routesrb

1Rails.application.routes.draw do 2 devise_for :users 3 root "home#top" 4 resources :themes do 5 resources :answers, only: [:create,:destroy] 6 end 7 8end 9 10

試したこと

<%= link_to "削除",theme_answer_path(a.theme_id,a.id),method: :delete %>など試しましたがエラーが出てしまい、稚拙な質問かもしれませんが回答お願いします。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答2

0

自己解決

<% @answers.each do |answer| %> の部分でミスがあったみたいでした。

<% @theme.answers.each do |answer| %>として

引数の部分をtheme_answer_path(@theme,answer)とすれば削除することができました。

投稿2020/05/18 18:38

taixnihsi

総合スコア4

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

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

0

answerのidがきているんですから、themeは気にせずに
@answer = Answer.find(params[:id])
で良いのでは

投稿2020/05/18 00:21

winterboum

総合スコア23567

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

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

taixnihsi

2020/05/18 18:36

初めまして、回答ありがとうございます。 試してみたのですが、エラーfが出てしまいました。 <% @answers.each do |answer| %> を<% @theme.answers.each do |answer| %> として、親と子の関係を確認するとできました! 回答ありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問