【Ruby on Rails】非同期コメント投稿時のRoutingError (No route matches [PATCH]....)を解消した話


対象者

  • コメント投稿時に[PATCH]を呼び出すエラーに遭遇している方

目的

  • ルーティングエラーを解消して、正常に稼働させる

実際の手順と実例

1.前提

  • コメント機能を非同期で実装
  • 投稿時、ターミナルに下記のエラーが現れる

ActionController::RoutingError (No route matches [PATCH] "/articles/19/comments/72"):

よく見ると投稿を押した段階でPATCHが呼び出されている、、、、
→本当はPOSTがほしい

  • rails routeコマンドで確認してもPOSTはあるし、PATCHはない
  • 以下CommentsController
comments_controller.rb
class Public::CommentsController < ApplicationController

  def create
    @article = Article.find(params[:article_id])
    @comments = @article.comments
    @comment = current_user.comments.new(comment_params)
    @comment_new = Comment.new
    @comment.article_id = @article.id
    @comment.save
  end
:
:
:
  def comment_params
    params.require(:comment).permit(:comment_content, :article_id, :user_id, :rate)
  end

end

2.結論(解決策)

saveメソッドの後に @comment = Comment.newを挿入

以下追記版です

comments_controller.rb
class Public::CommentsController < ApplicationController

  def create
    @article = Article.find(params[:article_id])
    @comments = @article.comments
    @comment = current_user.comments.new(comment_params)
    @comment_new = Comment.new
    @comment.article_id = @article.id
    if @comment.save
      @comment = Comment.new #追記
    else
      redirect_to request.referer #非同期できなかった場合、リダイレクトされる
    end
  end

3.原因

Viewのform_withの部分で

comment.show.html.erb
 <%= form_with(model: [@article, @comment], remote: true) do |f| %>

@commentがすでに保存済みのためupdateを呼び出していました。

@commentは新規の投稿なんだよー
と教えて上げるために、
save後にnewメソッドを改めて定義しました。

投稿者コメント

最初は意味がわからん!と思っていましたが、
冷静に順を追って考えて記事を探して解決に至りました。
解決のお役に立てたら嬉しいです。

My Profile

プログラミング学習歴3ヶ月目のアカウントです!
プログラミングスクールで学んだ内容や自分が躓いた箇所等のアウトプットの為に発信しています。
また、プログラミング初学者の方にわかりやすく、簡潔にまとめて情報共有できればと考えています。
もし、投稿した記事の中に誤り等ございましたら、コメント欄でご教授いただけると幸いです。