Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

rails ルーティングエラーが発生してしまいました 初心者なので凡ミスかもしれませんがご教授ください

解決したいこと

ルーティングエラーが発生してしまったのでその修正がしたいです。

例)
Ruby on Railsでprogateで作ったものを元にTwitterのようなWebアプリをつくっています。
コメント機能の実装中にエラーが発生しました。
解決方法を教えて下さい。

コメントを投稿するとルーティングエラーが発生してしまいます。

発生している問題・エラー

Routing Error
No route matches [GET] "/posts"
Rails.root: /Users/----/app/コメント機能開発中

Application Trace | Framework Trace | Full Trace
Routes
Routes match in priority from top to bottom

該当するソースコード

routes.rb
Rails.application.routes.draw do
  resources :posts, only: [] do
    resources :comments
  end
  post 'comments/:id/create' => 'comments#create'
  get 'comments/:id/destroy' => 'comments#destroy'

  get 'searches' => 'posts#search'

  get "likes/:post_id/create" => "likes#create"
  get "likes/:post_id/destroy" => "likes#destroy"
  
  post "users/:id/update" => "users#update"
  get "users/:id/edit" => "users#edit"
  post "users/create" => "users#create"
  get "signup" => "users#new"
  get "users/index" => "users#index"
  get "users/:id" => "users#show"
  post "login" => "users#login"
  get "logout" => "users#logout"
  get "login" => "users#login_form"

  get "users/:id/likes" => "users#likes"

  get "posts/index" => "posts#index"
  get "posts/new" => "posts#new"
  get "posts/:id" => "posts#show"
  post "posts/create" => "posts#create"
  get "posts/:id/edit" => "posts#edit"
  post "posts/:id/update" => "posts#update"
  get "posts/:id/destroy" => "posts#destroy"
  
  get "/" => "home#top"
  get "about" => "home#about"
end
comments_controller.rb
class CommentsController < ApplicationController
  before_action :authenticate_user
    def create
        @post = Post.find_by(params[:post_id])
        @comments = Comment.new(
          content: params[:content],
          user_id: @current_user.id,
          post_id: @post.id
        )
    
多分これが反応してない?--------------------------------------------------------------
        if @comments.save
          flash[:notice] = 'コメントを作成しました'
          redirect_to("/posts/#{params[:post_id]}")
        else
          flash[:notice] = 'コメントの作成に失敗しました'
          redirect_to("/posts/#{params[:post_id]}")
        end
ここまで---------------------------------------------------------------------------

    end
    
    def destroy
        @post = Post.find_by(params[:post_id])
        @comments = Comment.find_by(params[:id])
        @comments.destroy
        flash[:notice] = 'コメントを削除しました'
        redirect_to("/posts/#{params[:post_id]}")
    end
end

最後まで読んでいただいてありがとうございます。
教えていただけると幸いです。

0

2Answer

@NetaNeta0620
とりあえずですが、ここに載っていないソースが原因だと思います。
以下のルーティング(コメントの作成)に対して submit している画面
(view ファイル: 書いてないのでわかんないですけど .erb とか .slim)
が見えないとわからないですけど

post 'comments/:id/create' => 'comments#create'

エラーだけでみるなら form_with とかで指定しているメソッドが POST に
なってないのが原因ですね。
※デフォルトは GET メソッドなので
後、パスの指定も間違っている気がします。
※これも view ファイルがないのでエラーと質問内容からの推測ですが
 view ファイルと
bundle exec rake routes の結果貼ってもらえるとわかると思います。

1Like

Comments

  1. @NetaNeta0620

    Questioner

    回答いただきありがとうございます!!

    こちらにviewファイルとrails routesの結果を貼らせていただきます。
    他にも必要なデータがありましたら言っていただければ送らせていただきますのでよろしくお願いします。

    ```show.erb.html
    <% @comments.each do |comment| %>
    <div class="posts-index-item">
    <div class="post-left">
    <% if comment.user.avatar? %>
    <%= link_to (image_tag @user.avatar_url), "/users/#{@user.id}" %>
    <% else %>
    <%= link_to (image_tag src="default.jpg"), "/users/#{@user.id}" %>
    <% end %>
    </div>
    <div class="post-right">
    <div class="post-user-name">
    <%= link_to(comment.user.name, "/users/#{comment.user.id}") %>
    </div>
    <div class="post-title">
    <p><%= comment.content %></p>
    </div>
    <div class="post-menus">
    <% if @current_user && comment.user_id == @current_user.id %>
    <%= link_to("削除", "/comments/#{@post.id}/destroy", {method: "post"}) %>
    <% end %>
    </div>
    </div>
    </div>
    <% end %>

    <%= form_tag("/comments/:post_id/create") do %>
    <div class="form">
    <div class="form-body">
    <textarea name="content"><%= @comment.content %></textarea>
    <input type="submit" value="コメントする">
    </div>
    </div>
    <% end %>
    ```


    ```rails routes
    Prefix Verb URI Pattern Controller#Action
    post_comments GET /posts/:post_id/comments(.:format) comments#index
    POST /posts/:post_id/comments(.:format) comments#create
    new_post_comment GET /posts/:post_id/comments/new(.:format) comments#new
    edit_post_comment GET /posts/:post_id/comments/:id/edit(.:format) comments#edit
    post_comment GET /posts/:post_id/comments/:id(.:format) comments#show
    PATCH /posts/:post_id/comments/:id(.:format) comments#update
    PUT /posts/:post_id/comments/:id(.:format) comments#update
    DELETE /posts/:post_id/comments/:id(.:format) comments#destroy
    POST /comments/:id/create(.:format) comments#create
    GET /comments/:id/destroy(.:format) comments#destroy
    searches GET /searches(.:format) posts#search
    GET /likes/:post_id/create(.:format) likes#create
    GET /likes/:post_id/destroy(.:format) likes#destroy
    POST /users/:id/update(.:format) users#update
    GET /users/:id/edit(.:format) users#edit
    users_create POST /users/create(.:format) users#create
    signup GET /signup(.:format) users#new
    users_index GET /users/index(.:format) users#index
    GET /users/:id(.:format) users#show
    login POST /login(.:format) users#login
    logout GET /logout(.:format) users#logout
    GET /login(.:format) users#login_form
    GET /users/:id/likes(.:format) users#likes
    posts_index GET /posts/index(.:format) posts#index
    posts_new GET /posts/new(.:format) posts#new
    GET /posts/:id(.:format) posts#show
    posts_create POST /posts/create(.:format) posts#create
    GET /posts/:id/edit(.:format) posts#edit
    POST /posts/:id/update(.:format) posts#update
    GET /posts/:id/destroy(.:format) posts#destroy
    GET / home#top
    about GET /about(.:format) home#about
    turbo_recede_historical_location GET /recede_historical_location(.:format) turbo/native/navigation#recede
    turbo_resume_historical_location GET /resume_historical_location(.:format) turbo/native/navigation#resume
    turbo_refresh_historical_location GET /refresh_historical_location(.:format) turbo/native/navigation#refresh
    rails_postmark_inbound_emails POST /rails/action_mailbox/postmark/inbound_emails(.:format) action_mailbox/ingresses/postmark/inbound_emails#create
    rails_relay_inbound_emails POST /rails/action_mailbox/relay/inbound_emails(.:format) action_mailbox/ingresses/relay/inbound_emails#create
    rails_sendgrid_inbound_emails POST /rails/action_mailbox/sendgrid/inbound_emails(.:format) action_mailbox/ingresses/sendgrid/inbound_emails#create
    rails_mandrill_inbound_health_check GET /rails/action_mailbox/mandrill/inbound_emails(.:format) action_mailbox/ingresses/mandrill/inbound_emails#health_check
    rails_mandrill_inbound_emails POST /rails/action_mailbox/mandrill/inbound_emails(.:format) action_mailbox/ingresses/mandrill/inbound_emails#create
    rails_mailgun_inbound_emails POST /rails/action_mailbox/mailgun/inbound_emails/mime(.:format) action_mailbox/ingresses/mailgun/inbound_emails#create
    rails_conductor_inbound_emails GET /rails/conductor/action_mailbox/inbound_emails(.:format) rails/conductor/action_mailbox/inbound_emails#index
    POST /rails/conductor/action_mailbox/inbound_emails(.:format) rails/conductor/action_mailbox/inbound_emails#create
    new_rails_conductor_inbound_email GET /rails/conductor/action_mailbox/inbound_emails/new(.:format) rails/conductor/action_mailbox/inbound_emails#new
    edit_rails_conductor_inbound_email GET /rails/conductor/action_mailbox/inbound_emails/:id/edit(.:format) rails/conductor/action_mailbox/inbound_emails#edit
    rails_conductor_inbound_email GET /rails/conductor/action_mailbox/inbound_emails/:id(.:format) rails/conductor/action_mailbox/inbound_emails#show
    PATCH /rails/conductor/action_mailbox/inbound_emails/:id(.:format) rails/conductor/action_mailbox/inbound_emails#update
    PUT /rails/conductor/action_mailbox/inbound_emails/:id(.:format) rails/conductor/action_mailbox/inbound_emails#update
    DELETE /rails/conductor/action_mailbox/inbound_emails/:id(.:format) rails/conductor/action_mailbox/inbound_emails#destroy
    new_rails_conductor_inbound_email_source GET /rails/conductor/action_mailbox/inbound_emails/sources/new(.:format) rails/conductor/action_mailbox/inbound_emails/sources#new
    rails_conductor_inbound_email_sources POST /rails/conductor/action_mailbox/inbound_emails/sources(.:format) rails/conductor/action_mailbox/inbound_emails/sources#create
    rails_conductor_inbound_email_reroute POST /rails/conductor/action_mailbox/:inbound_email_id/reroute(.:format) rails/conductor/action_mailbox/reroutes#create
    rails_conductor_inbound_email_incinerate POST /rails/conductor/action_mailbox/:inbound_email_id/incinerate(.:format) rails/conductor/action_mailbox/incinerates#create
    rails_service_blob GET /rails/active_storage/blobs/redirect/:signed_id/*filename(.:format) active_storage/blobs/redirect#show
    rails_service_blob_proxy GET /rails/active_storage/blobs/proxy/:signed_id/*filename(.:format) active_storage/blobs/proxy#show
    GET /rails/active_storage/blobs/:signed_id/*filename(.:format) active_storage/blobs/redirect#show
    rails_blob_representation GET /rails/active_storage/representations/redirect/:signed_blob_id/:variation_key/*filename(.:format) active_storage/representations/redirect#show
    rails_blob_representation_proxy GET /rails/active_storage/representations/proxy/:signed_blob_id/:variation_key/*filename(.:format) active_storage/representations/proxy#show
    GET /rails/active_storage/representations/:signed_blob_id/:variation_key/*filename(.:format) active_storage/representations/redirect#show
    rails_disk_service GET /rails/active_storage/disk/:encoded_key/*filename(.:format) active_storage/disk#show
    update_rails_disk_service PUT /rails/active_storage/disk/:encoded_token(.:format) active_storage/disk#update
    rails_direct_uploads POST /rails/active_storage/direct_uploads(.:format) active_storage/direct_uploads#create
    ```

@NetaNeta0620
とりあえず気になったのは以下ですかね。
※エラー解消優先でこうした方がいいとかは省きます。

show.html.erb
<%= form_tag("/comments/:post_id/create") do %>
↓
<%= form_tag("/comments/#{@post.id}/create", method: :post) do %>

params[:post_id] している箇所を params[:id] に修正

comments_controller.rb
params[:post_id]

params[:id]
0Like

Comments

  1. @NetaNeta0620

    Questioner

    コードを書き換えてみましたが同じく
    Routing Error
    No route matches [GET] "/posts"
    とエラーが出てきてしまいます。

    ほかのところが原因なのでしょうか?
  2. @NetaNeta0620
    どの画面でどういう操作したら、上記のエラーが
    出るか記載してもらっても良いでしょうか。
    ※例. 記事詳細画面でコメントテキストエリアにコメントを入力して「登録」ボタンを押下した際等

    今のもらっている情報だけだと、全ソース貰わないと
    候補が多すぎて回答できないので

    後、 Rails の バージョンもお願いします。
  3. @NetaNeta0620

    Questioner

    バージョンはRails 7.0.3とruby 3.1.2です。

    投稿詳細ページにあるコメント投稿機能の投稿ボタンを押すとエラーが出てしまいます。

  4. @NetaNeta0620
    可能であれば、Rails 6 系で作り直したほうが早いと思います。
    多分 rails 7 ってことは turbo 機能と link_to 関連の問題だとは思いますが
    参考にされたものとかは Rails 6 系だとかないですか?

    まだ、Rails 7 系の記事は少ないですし Rails 7 系特有のエラーもあるので
    初心者だということなので、参考とされる記事とバージョンを揃えた方が
    よいと思います。
  5. @NetaNeta0620

    Questioner

    作り直してみます。
    親身に教えていただき助かりました!
    ありがとうございます!!

Your answer might help someone💌