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

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

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

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

Q&A

解決済

2回答

948閲覧

コメント機能 削除について

Yn_26247

総合スコア16

Ruby on Rails

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

0グッド

0クリップ

投稿2020/08/24 11:13

編集2020/08/24 11:19

投稿に対してコメントをつける機能を実装しています。
コメントを新規作成はできるのですが、削除する際にエラーが発生してしまいます。

投稿を表示、削除のボタンを

_index.html.erb

1<table> 2 <thead> 3 </thead> 4 5 <tbody> 6 <% book.book_comment.each do |book_comment| %> 7 <tr> 8 <th> 9 <%= attachment_image_tag(book_comment.user, :profile_image, :fill, 60, 60, fallback: "no_image.jpg", class: "img-circle pull-left profile-thumb")%> 10 <%= book_comment.user.name %> 11 </th> 12 <th> 13 <%= book_comment.comment %> 14 </th> 15 <td> 16 <div><% if book_comment.user == current_user %> 17 <%= link_to 'Destroy', book_book_comment_path(book_comment),method: :delete %></div> 18 <% end %> 19 </td> 20 <% end %> 21 </tr> 22 </tbody> 23 </table> 24 25 26
: : <%= render 'book_comments/index', book: @book %> : :
#book_commentコントローラー : : : def destroy book_comment = BookComment.find_by(id: params[:id], user_id: params[:user_id]) if book_comment.user == current_user book_comment.destroy redirect_to book_path(params[:book_id]) else @book = Book.find(params[:id]) @user = @book.user @book_new = Book.new @book_comment = BookComment.new redirect_to book_path(book) end end private def book_comment_params params.require(:book_comment).permit(:comment,:user_id) end end

ルーティングを

resources :books do resource :favorites, only: [:create, :destroy] resources :book_comments, only: [:create, :destroy] end end

としているのですが、以下のようなエラーがでてしまいます。
イメージ説明

おそらくbook_commentsがうまく渡せていないのが原因かと思うのですが、
何かアドバイスいただけるとありがたいです。

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

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

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

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

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

Yn_26247

2020/08/24 11:24

本当に申し訳ございません。 勉強を始めて日が浅く、基本的なこともわかっていないような初心者です。というようなニュアンスを伝えるために「がちがちの」と使ってしまいました。 今後は正しく日本語を使えるように努力したいと思います。 できればその下も読んでいただけるとありがたいです。
no1knows

2020/08/24 11:55

> 引用テキストおそらくbook_commentsがうまく渡せていないのが原因かと思うのですが、 エラーは、下記を基に解決していきます。 ①エラー文を読む(翻訳する) `NoMethodError in BookCommentsController#destroy` `undefined method 'user' for nil:NilClass` ②デバッグする 参考:[https://www.youtube.com/watch?v=5fyrGslhUcY](https://www.youtube.com/watch?v=5fyrGslhUcY) もし②デバッグしていないようであれば、一度トライしてみることをおすすめします。 そうすれば今後、自分で解決できるようになるかと思います。
Yn_26247

2020/08/24 17:40

ありがとうございます。 gem 'better_errors'の存在は初めて知ったので、今後活用していこうと思います。
guest

回答2

0

ベストアンサー

book_commentは、book_book_comment_path(book_comment)で送信されているので、下記のような形で期待した動作ができるのではないでしょうか?

def destroy if @book_comment.user == current_user @book_comment.destroy redirect_to book_path(params[:book_id]) # ここのparams[:book_id]は@book_comment.book_idとかになりそうですが、 # テーブルやカラムの構成がどのようになっているかわからないのでなんとも言えませんが・・・ else # このリダイレクトは、下記全て削除してログインページで良い気もします。 # そもそもコメントを書いた本人ではない人もしくは書いた本人がログインしていない状態で # Viewでは表示されないはずのリンクをクリックしているとのことなので。 @book = Book.find(params[:id]) @user = @book.user @book_new = Book.new @book_comment = BookComment.new redirect_to book_path(book) end end

投稿2020/08/25 13:03

no1knows

総合スコア3365

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

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

0

デバッグしろというのは確かにその通りですが、、、
基本的なことを理解されていないのかなとも思うので、とりあえず作るのはいいけど、仕組みを理解するのも大事かなと思います。
その辺は自分で勉強してもらえればと思いますが、わかることだけ書いておきます。

Ruby

1book_comment = BookComment.find_by(id: params[:id], user_id: params[:user_id])

のbook_commentがnilだからエラーが発生しています。
ここでBookCommentを正しくfindできれば、今発生しているエラーは解消できると思います。

bookcommentのid渡しているので、下記のようにして動くか試してみてください。
現状だとuser_idはviewから渡してないので意図しない結果になると思います。

Ruby

1book_comment = BookComment.find_by(id: params[:id])

投稿2020/08/25 09:41

Cojiro

総合スコア539

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問