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

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

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

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

Haml

Haml(HTML abstraction markup language)は、HTML/XHTMLを効率的に記述するためのマークアップ言語および記法です。

Ruby on Rails

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

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Q&A

解決済

1回答

2360閲覧

コメント削除機能の実装の際、undefined method `join' というエラーが出る

RF18CHAMPION

総合スコア6

Ruby on Rails 5

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

Haml

Haml(HTML abstraction markup language)は、HTML/XHTMLを効率的に記述するためのマークアップ言語および記法です。

Ruby on Rails

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

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

0グッド

0クリップ

投稿2020/03/30 05:55

前提・実現したいこと

railsで映画のレビュー投稿サイトを製作しています。
投稿したレビューに対してコメントを投稿する機能を実装したのですが、
そのコメントを削除するという機能を追加しようと思っています。
その際に、以下のエラーが出ました。

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

NoMethodError in CommentsController#destroy undefined method `join' for {:id=>"6", :post_id=>"6"}:Hash

該当のソースコード

Ruby

1##posts/show.html.haml## 2(略) 3.userComments 4 %h4 <コメント一覧> 5 - if @comments 6 - @comments.each do |comment| 7 .userComments__comment 8 .userComments__comment-info 9 = link_to comment.user.nickname, "/users/#{comment.user_id}", class: "userComments__nickname" 10 .userComments__created-at 11 = comment.created_at 12 = link_to "削除", post_comment_path(comment.post_id, comment.id), class: ##serComments__edit-btn", method: :delete 13 .userComments__text 14 = comment.text 15 16##comments_controller.rb## 17(略) 18def destroy 19 comment = Comment.find(id: params[:id], post_id: params[:post_id]) 20 comment.destroy 21 redirect_to posts_path 22 end 23 24##routes.rb## 25Rails.application.routes.draw do 26 devise_for :users 27 root to: "posts#index" 28 resources :posts, except: :index do 29 resources :comments, only: [:create, :destroy] 30 end 31 resources :users, only: :show 32end 33

試したこと

binding.pryをcomments_controller.rb内で使用した。
すると、commentsテーブルのidが正しく渡されていないことがわかりました。
そこで、comment = Comment.find(id: params[:id], post_id: params[:post_id])
を、comment = Comment.find(comment_id: params[:comment_id], post_id: params[:post_id])
に修正してみましたが、
undefined method `join' for {:comment_id=>nil, :post_id=>"6"}:Hash
というエラーが出ました。
何れにしても、comment_id: params[:comment_id]
という部分(書き方?)が間違っているように思います。

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

こちら初学者です、、
頑張って理解に努めますので是非返信のほどよろしくお願いいたします、、、
ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

find => find_by にしましょう。
findはidでしか検索できません。

これがベストです。

ruby

1def destroy 2 post = Post.find(params[:post_id]) 3 comment = post.comments.find(params[:id]) 4 comment.destroy 5 redirect_to post 6end

投稿2020/03/30 06:27

s.k

総合スコア423

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

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

RF18CHAMPION

2020/03/30 06:37

早速のご返信ありがとうございます! 下記のように修正したところ、 NoMethodError in CommentsController#destroy undefined method `destroy' for nil:NilClass というエラー文が出てしまいました。 期待したcomment_idの取得には成功したようですが、destroyメソッドが発火しないようです、、、 よかったら返信お待ちしております????‍♂️ ##comments.controller.rb## def destroy post = Post.find_by(params[:post_id]) comment = post.comments.find_by(params[:id]) comment.destroy redirect_to posts_path end
s.k

2020/03/30 06:39

find_byを使う場合はidキーを指定します。 `find_by(id: params[:id])`
RF18CHAMPION

2020/03/30 06:45

返信ありがとうございます。 ご指摘のところを修正いたしましたが、 NoMethodError in CommentsController#destroy undefined method `destroy' for nil:NilClass と、同じエラー文が出てしまっています、、 method: :delete等はlink_to内で指定してあるので、 発火しない要因が未だわかりません、、、
s.k

2020/03/30 06:47

ログを見ていただけますか。 パラメータに post_id と id は存在しますか。
RF18CHAMPION

2020/03/30 06:56

当方初学者なもので、ログを見る=ターミナル上でルートを確認する という解釈でよろしいでしょうか? post_comment DELETE /posts/:post_id/comments/:id(.:format) と表示されています。 post_idとidは存在しているように見受けられます。 また、ローカル環境では http://localhost:3000/posts/6/comments/11 と表示されているので、何れにしてもcomment_idは取得できていると思います、、、
s.k

2020/03/30 07:36

paramsの中見を見れればログなんでも構いません。paramsに値は入ってますか。
RF18CHAMPION

2020/03/30 07:44

binding.pryを使って挙動を確認いたしました。 7: def destroy => 8: binding.pry 9: post = Post.find_by(id: params[:post_id]) 10: comment = post.comments.find_by(id: params[:id]) 11: comment.destroy 12: redirect_to posts_path 13: end この記述を見るとparamsの中身はpost_id, idいずれも取れているように見えます。
s.k

2020/03/30 07:47

> paramsの中身はpost_id, idいずれも取れているように見えます。 post_idとidはなんですか。
RF18CHAMPION

2020/03/30 07:50

post_id"=>"7", "id"=>"17" と表示されています。
s.k

2020/03/30 07:51

それぞれのidが存在するのか確認したいのですが、 postとcommentに値は入ってますか?
RF18CHAMPION

2020/03/30 09:20

返信が遅くなり申し訳ございません。 結論から申し上げると解決することができました。 理由はredirect_toのパスが間違っていました。 リダイレクトの引数もcomment.post_id と、2テーブルに横断する際の方法も理解することができました。 何れにしても削除することはできていました。 本当に長い時間時間を割いてくれてありがとうございました!!!
s.k

2020/03/30 09:20

よかったです!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問