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

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

ただいまの
回答率

87.77%

コメントを保存したいがルーティングエラーが発生して保存できない。

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 446

score 4

前提・実現したいこと

commentを保存したい。

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

Routing Error
No route matches [POST] "/prototypes/12"

該当のソースコード

app/views/prototypes/show.html

<main class="main">
  <div class="inner">
    <div class="prototype__wrapper">
      <p class="prototype__hedding">
        <%= @prototype.title %>
      </p>
      <%= link_to "by #{@prototype.user.name}", root_path, class: :prototype__user %>
      <%# プロトタイプの投稿者とログインしているユーザーが同じであれば以下を表示する %>
      <% if user_signed_in? && current_user.id == @prototype.user_id %>
        <div class="prototype__manage">
          <%= link_to "編集する", edit_prototype_path(@prototype.id), class: :prototype__btn %>
          <%= link_to "削除する", prototype_path, class: :prototype__btn, method: :delete%>
        </div>
      <% end %>
      <%# // プロトタイプの投稿者とログインしているユーザーが同じであれば上記を表示する %>
      <div class="prototype__image">
        <%= image_tag @prototype.image %>
      </div>
      <div class="prototype__body">
        <div class="prototype__detail">
          <p class="detail__title">キャッチコピー</p>
          <p class="detail__message">
            <%= @prototype.catch_copy %>
          </p>
        </div>
        <div class="prototype__detail">
          <p class="detail__title">コンセプト</p>
          <p class="detail__message">
            <%= @prototype.concept %>
          </p>
        </div>
      </div>
      <div class="prototype__comments">
        <%# ログインしているユーザーには以下のコメント投稿フォームを表示する %>
        <% if user_signed_in? %>
           <%= form_with local: true  do |f|%>
            <div class="field">
               <%= f.label :text, "コメント" %><br />
               <%= f.text_field :text %>
            </div>
            <div class="actions">
               <%= f.submit "送信する", class: :form__btn  %>
            </div>
            <% end %> 
          <% end %>
        <%# // ログインしているユーザーには上記を表示する %>
        <ul class="comments_lists">
          <%# 投稿に紐づくコメントを一覧する処理を記述する %>
            <li class="comments_list">
               <%= " コメントのテキスト "%>
               <%= link_to "( ユーザー名 )", root_path, class: :comment_user %>
            </li>
          <%# // 投稿に紐づくコメントを一覧する処理を記述する %>
        </ul>
      </div>
    </div>
  </div>
</main>


config/routes.rb

Rails.application.routes.draw do
  devise_for :users
  root to:'prototypes#index'

  resources :prototypes do
    resources :comments, only: :create 
  end

end


ルーティング

 Prefix Verb   URI Pattern                                                                              Controller#Action
                     new_user_session GET    /users/sign_in(.:format)                                                                 devise/sessions#new
                         user_session POST   /users/sign_in(.:format)                                                                 devise/sessions#create
                 destroy_user_session DELETE /users/sign_out(.:format)                                                                devise/sessions#destroy
                    new_user_password GET    /users/password/new(.:format)                                                            devise/passwords#new
                   edit_user_password GET    /users/password/edit(.:format)                                                           devise/passwords#edit
                        user_password PATCH  /users/password(.:format)                                                                devise/passwords#update
                                      PUT    /users/password(.:format)                                                                devise/passwords#update
                                      POST   /users/password(.:format)                                                                devise/passwords#create
             cancel_user_registration GET    /users/cancel(.:format)                                                                  devise/registrations#cancel
                new_user_registration GET    /users/sign_up(.:format)                                                                 devise/registrations#new
               edit_user_registration GET    /users/edit(.:format)                                                                    devise/registrations#edit
                    user_registration PATCH  /users(.:format)                                                                         devise/registrations#update
                                      PUT    /users(.:format)                                                                         devise/registrations#update
                                      DELETE /users(.:format)                                                                         devise/registrations#destroy
                                      POST   /users(.:format)                                                                         devise/registrations#create
                                 root GET    /                                                                                        prototypes#index
                   prototype_comments POST   /prototypes/:prototype_id/comments(.:format)                                             comments#create
                           prototypes GET    /prototypes(.:format)                                                                    prototypes#index
                                      POST   /prototypes(.:format)                                                                    prototypes#create
                        new_prototype GET    /prototypes/new(.:format)                                                                prototypes#new
                       edit_prototype GET    /prototypes/:id/edit(.:format)                                                           prototypes#edit
                            prototype GET    /prototypes/:id(.:format)                                                                prototypes#show
                                      PATCH  /prototypes/:id(.:format)                                                                prototypes#update
                                      PUT    /prototypes/:id(.:format)                                                                prototypes#update
                                      DELETE /prototypes/:id(.:format)                                                                prototypes#destroy


models/prototype

class Prototype < ApplicationRecord
  belongs_to :user
  has_many :comments , dependent: :destroy
  has_one_attached :image

  validates :title , presence: true
  validates :catch_copy , presence: true
  validates :concept , presence: true
  validates :image, presence: true
end


models/comment

class Comment < ApplicationRecord
  belongs_to :user
  belongs_to :prototype

  validates :text , presence: true
end


db/✖️✖️✖️✖️_create_comments

class CreateComments < ActiveRecord::Migration[6.0]
  def change
    create_table :comments do |t|
      t.text :text
      t.timestamps
      t.references :user, foreign_key: true
      t.references :prototype, foreign_key: true
    end
  end
end


controllers/comments_contoroller

class CommentsController < ApplicationController

  def create
    @comment = Comment.new(comment_params)
    if @comment.save
      redirect_to prototype_comments_path(@comment.prototype) 
    else
      @prototype = @comment.prototype
      @comments = @prototype.comments
      render "prototype/show" 
    end
  end

  private
  def comment_params
    params.require(:comment).permit(:text).merge(user_id: current_user.id, prototype_id: params[:prototype_id])
  end

end

試したこと

app/views/prototypes/show.htmlのコメント送信するform_withの部分にurlが書かれていないからルートが正しく通っていないと考察し、ルーティングのパスを参考に記述したが変わらなかった。

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

Rails 6.0.3.4
ruby 2.6.5

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • gomappi

    2021/01/14 22:11

    ルーティングに入力して実行しました。
    https://gyazo.com/faf602b57df82521efc4c13ea99295d2
    と表示されました。今度はコメントが空になっているのか、paramsがないのかという意味だと思うのですが、どうでしょうか?

    キャンセル

  • m.ts10806

    2021/01/14 22:25

    あとはデバッグですね。

    キャンセル

  • gomappi

    2021/01/14 22:29

    そうですね。ルーティングには成功していますのでデバッグを頑張ってみます。

    キャンセル

回答 1

check解決した方法

0

ルーティング

post '/prototypes/:id', to: 'comments#create'


を追加。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 87.77%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る