🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

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

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

2335閲覧

【Rails】No route matches [PATCH] が解決できない

veludo

総合スコア3

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

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

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2021/03/19 03:31

前提・実現したいこと

Rails勉強中のプログラミング初心者です。
新規投稿・閲覧・編集・削除が可能なアプリケーションを作成して練習しています。
投稿・閲覧・削除機能は実装済みで、投稿されたデータを編集して更新する機能をつけたいのですが、更新ボタン('Update Book')を押すと、以下のエラーが出てしまい、更新できずにいます。

エラーメッセージ

Routing Error
No route matches [PATCH] "/books1"

Request
Parameters:

{"utf8"=>"✓",
"_method"=>"patch",
"authenticity_token"=>"eAXJDUfwXsQSCjfMvblTNn3D8f3jateAhhfDhFNm8VqxLsccc4pkT1KHNLs8VkDVOxqS3IPD3BYMwyL5rWVA0w==",
"book"=>{"title"=>"test", "body"=>"test"},
"commit"=>"Update Book"}

###Routes.rb

Ruby

1Rails.application.routes.draw do 2 3#For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html 4 root to: 'homes#top' 5 get 'books' => 'books#index', as: 'index_book' 6 post 'books' => 'books#create' 7 8 9 get 'books/:id' => 'books#show', as: 'show_book' 10 get 'books/edit' => 'books#edit' 11 get 'books/:id/edit' => 'books#edit', as: 'edit_book' 12 patch 'books/:id' => 'books#update', as: 'update_book' 13 14 15 delete 'books/:id' => 'books#destroy', as: 'destroy_book' 16end

###books_controller.rb

Ruby

1class BooksController < ApplicationController 2 def index 3 @books = Book.all 4 @book = Book.new 5 end 6 7 def create 8 book = Book.new(book_params) 9 book.save 10 redirect_to books_path(book.id) 11 end 12 13 def show 14 @book = Book.find(params[:id]) 15 end 16 17 def new 18 end 19 20 def edit 21 @book = Book.find(params[:id]) 22 end 23 24 def update 25 book = Book.find(params[:id]) 26 book.update(book_params) 27 redirect_to book_path(book.id) 28 end 29 30 def destroy 31 book = Book.find(params[:id]) 32 book.destroy 33 redirect_to books_path 34 end 35 36 private 37 def book_params 38 params.require(:book).permit(:title, :body) 39 end 40end

###edit.html.erb

html

1<h1>Editing Book</h1> 2<!-- form_with部分 --> 3<%= form_with model: @book, url: "/books#{@book.id}", local:true do |f| %> 4 <h4>Title</h4> 5 <%= f.text_field :title %> 6 <h4>Body</h4> 7 <%= f.text_area :body %> 8 <%= f.submit 'Update Book' %> 9 <%= link_to "Show", show_book_path(@book.id) %> 10 <%= link_to "Back", index_book_path(@book.id) %> 11<% end %>

###new.html.erb

html

1<h1>New Book</h1> 2<!-- form_with部分 --> 3<%= form_with model:@book, url: '/books', local:true do |f| %> 4 <h4>Title</h4> 5 <% f.text_field :title %> 6 <h4>Body</h4> 7 <%= f.text_area :body %> 8 <%= f.submit 'Create Book'%> 9<% end %>

###show.html.erb

html

1<h2>Title:</h2> 2<p><%= @book.title %></p> 3<h2>Body:</h2> 4<p><%= @book.body %></p> 5<%= link_to "Edit", edit_book_path(@book.id) %> 6<%= link_to "Back", "/books" %>

###index.html.erb

html

1<h1>Books</h1> 2<table> 3 <tr> 4 <th>title</th> 5 <th>body</th> 6 <th></th> 7 </tr> 8 9 <% @books.each do |book| %> 10 <tr> 11 <td><span><%= book.title %></span></td> 12 <td><span><%= book.body %></span></td> 13 <td><%= link_to "Show", show_book_path(book.id) %></td> 14 <td><%= link_to "Edit", edit_book_path(book.id) %></td> 15 <td><%= link_to "Destroy", destroy_book_path(book.id), method: :delete, "date-confirm" => "Are you sure?" %></td> 16 </tr> 17 <% end %> 18</table> 19 20 <h3>New book</h3> 21 <!-- form_with部分 --> 22 <%= form_with model: @book, url: "/books#{@book.id}", local:true do |f| %> 23 <h4>Title</h4> 24 <%= f.text_field :title %> 25 <h4>Body</h4> 26 <%= f.text_area :body %> 27 <%= f.submit 'Create Book' %> 28 <% end %>

似たような質問やサイトなど参考にしましたが、解決に至っておりません。
説明不足で申し訳ありませんが、よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

edit.html.erb で,form_withurl の値が

rb

1"/books#{@book.id}"

になっているからでしょうね。これだと "/books1" みたいな文字列になりますが,本来なら "/books/1" のように id の前にスラッシュが入らなくてはなりません。

もちろん

rb

1"/books/#{@book.id}"

と書いてもいいのですが,URL はパスヘルパーを使って書くのがよいでしょう。
つまり,

rb

1book_path(@book.id)

ですね。これは実は

rb

1book_path(@book)

と書いても OK です。引数がモデルオブジェクトの場合は自動的に id を取ってくれるという親切設計。

投稿2021/03/19 04:16

scivola

総合スコア2108

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

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

veludo

2021/03/19 05:03 編集

無事に更新することができました。 詳しい説明もありがとうございます。 勉強になりました。 ご回答いただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問