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

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

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

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

Q&A

解決済

1回答

1495閲覧

rails コメント機能のバリデーション時のエラー「ActionController::UrlGenerationError」について

yusei01

総合スコア3

Ruby on Rails

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

0グッド

0クリップ

投稿2021/07/05 23:26

編集2021/07/06 00:56

コメント機能を現在実装していて、設定したバリデーションを超えてコメントするとエラーが出てしまいます。
エラー内容は以下の通りです。

ActionController::UrlGenerationError in Comments#create Showing /app/app/views/posts/show.html.erb where line #137 raised: No route matches {:action=>"destroy", :controller=>"comments", :id=>nil, :post_id=>"8"}, missing required keys: [:id]

なお、自分の書いたコードは以下の通りです。

---comment.rb--- class Comment < ApplicationRecord belongs_to :user belongs_to :post validates :content, presence: true, length: { maximum:255 } end
---show.html.erb--- <!--コメントフォーム--> <%= form_with(model: [@post, @comment], local: true) do |f| %> <div class="comment-form"> <%= f.label :content, 'コメント' %> <%= hidden_field_tag :post_id, @post.id %> <%= f.text_area :content, class: 'comment-form-control' %> <%= f.submit 'コメントする', class: 'comment-btn btn' %> </div> <% end %> <!--投稿削除ボタン--> <% @post.comments.each do |comment| %> <% if current_user == comment.user %> <div class="comment-delete btn"> <!--以下がエラーの原因となっている137行目になります。--> <%= link_to 'コメントを削除する', post_comment_path(@post, comment), method: :delete, data: { confirm: '本当に削除してよろしいでしょうか?' } %> </div> <% end %> <% end %>
---posts_controller.rb--- class PostsController < ApplicationController def show @post = Post.find(params[:id]) @user = @post.user @comment = Comment.new counts(@post) end end
---comments_controller.rb--- class CommentsController < ApplicationController def create @post = Post.find(params[:post_id]) @comment = @post.comments.build(comment_params) @comment.user_id = current_user.id if @comment.save flash[:notice] = 'コメントしました。' redirect_to @post else flash[:notice] = 'コメントに失敗しました。' render template: "posts/show" end end def destroy @post = Post.find(params[:post_id]) comment = @post.comments.find(params[:id]) @comment.destroy flash[:notice] = 'コメントを削除しました。' redirect_to @post end end
Rails.application.routes.draw do ---routes.rb--- #posts GET /posts(.:format) posts#index # POST /posts(.:format) posts#create #new_post GET /posts/new(.:format) posts#new # post GET /posts/:id(.:format) posts#show # DELETE /posts/:id(.:format) posts#destroy #post_comments POST /posts/:post_id/comments(.:format) comments#create #post_comment DELETE /posts/:post_id/comments/:id(.:format) comments#destroy resources :posts, only: [:index, :show, :new, :create, :destroy] resources :posts do resources :comments, only: [:create, :destroy] end end

エラー内容から、「comments_controller.rbに記載されているdestroyメソッドの中のcommentのidがない」と読み取れるますが解決方法が分かりません。ご教示いただけたら幸いです。
よろしくお願いします。

追記
エラーの原因となっている137行目は以下の部分です。

---app/views/posts/show.html.erb where line #137--- <%= link_to 'コメントを削除する', post_comment_path(@post, comment), method: :delete, data: { confirm: '本当に削除してよろしいでしょうか?' } %>

よろしくお願いいたします。

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

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

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

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

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

winterboum

2021/07/05 23:41

Showing /app/app/views/posts/show.html.erb where line #137 raised: この137行目ってどの行?
yusei01

2021/07/06 00:58 編集

ご回答ありがとうございます。 Showing /app/app/views/posts/show.html.erb where line #137 raised:は <%= link_to 'コメントを削除する', post_comment_path(@post, comment), method: :delete, data: { confirm: '本当に削除してよろしいでしょうか?' } %> のコメント削除ボタンの部分になります。 エラー原因につきまして、ご教示いただけたら幸いです。 よろしくお願いいたいします。
guest

回答1

0

ベストアンサー

原因は明確で post_comment_path(@post, comment) のcommentに id の無いものが混じっているから、です。
なぜそうなったかというと

@comment = @post.comments.build(comment_params) @comment.user_id = current_user.id

ここで「既に読み込まれている」 @post の comments に @comment も追加されました。こいつがsave失敗したので idなしのcommentが出来てしまったのです。
で、どうしたらよいか、ですが安直な方法としては、elseで@postを読み直せば良いかと思います。

投稿2021/07/06 02:30

winterboum

総合スコア23544

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

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

yusei01

2021/07/06 03:27

ご回答ありがとうございます。 validationを超えたコメントがsaveに失敗し、idのないコメントが@post.commentsに含まれてしまったためにエラーが出てしまっている旨理解することができました。 ただし、comment_contoroller.rbのcreateメソッド内のelseで@postを読み直したらエラーが解消される理由が理解できませんでした。(この方法でエラーは解決できました。) idなしのコメントを@post.commentsから削除するために@postをelseで再度読み込んでいるということでしょうか。 たびたびの質問で大変恐縮ですが、ご教示いただけたら幸いです。 よろしくお願いいたします。
winterboum

2021/07/06 07:01

DBから@postを読み込んだ直後は@post.commentsはDBにあるcommetだけがぶら下がります
yusei01

2021/07/06 12:01

ご回答ありがとうございます。 納得できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問