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

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

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

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

Q&A

解決済

1回答

895閲覧

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

shrimpshrimp

総合スコア7

Ruby on Rails

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

0グッド

0クリップ

投稿2018/02/25 13:51

#困っていること
Rails勉強中の初心者です。

新規投稿・閲覧・編集・削除などができる簡単なアプリケーションを作成して練習しています。
投稿機能は実装済みで、投稿されたデータを編集して更新する機能をつけたいのですが、以下のエラーが出てしまい、うまくいきません。ググりましたが具体的な解決策を見つけられませんでしたので、力を貸して欲しいです(;_;)
よろしくお願い致します。

#エラーメッセージ
Routing Error
No route matches [PATCH] "/posts1"

Request
Parameters:
{"utf8"=>"✓",
"_method"=>"patch",
"authenticity_token"=>"Aae+JE3EbqmhfvV6wkf826/hCpF0Po2tfxlFURyYv7pDTOl1QZdKXxuDT2G0HJTiCKG9i6a63WA2hd1ueAsjxw==",
"post"=>{"title"=>"投稿テスト", "body"=>"投稿"},
"commit"=>"Update Book"}

##routes.rb

ruby

1 2Rails.application.routes.draw do 3 #新規投稿・投稿一覧 4 get 'posts/new' => 'posts#new' 5 6 # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html 7 get '/' => 'root#top' 8 post '/posts' => 'posts#create' 9 get 'posts:id' => 'posts#show', as: 'post' 10 get 'posts/:id/edit' => 'posts#edit', as: 'edit_post' 11 patch '/posts/:id' => 'posts#update', as: 'update_post' 12end

##posts_controller.rb

ruby

1class PostsController < ApplicationController 2 def new 3 @post = Post.new 4 @posts = Post.all 5 end 6 def create 7 # ストロングパラメーターを使用 8 post = Post.new(post_params) 9 # DBへ保存する 10 post.save 11 # 新規投稿画面へリダイレクト 12 redirect_to '/posts/new' 13 end 14 15 def show 16 @post = Post.find(params[:id]) 17 end 18 19 def edit 20 @post = Post.find(params[:id]) 21 end 22 23 def update 24 post = Post.find(params[:id]) 25 post.update(post_params) 26 redirect_to post_path(post.id) 27 end 28 29 private 30 def post_params 31 params.require(:post).permit(:title, :body) 32 end 33end 34

##new.html.erb

html

1<h1>Books</h1> 2<!--テーブル開始--> 3<table> 4<thead> 5 <tr> 6 <th>title</th> 7 <th>body</th> 8 </tr> 9</thead> 10 11<tbody> 12<% @posts.each do |post| %> 13 <tr> 14 <td> 15 <%= post.title %> 16 </td> 17 <td> 18 <%= post.body %> 19 </td> 20 <td> 21 <%= link_to "edit",edit_post_path(post.id)%> 22 <%= link_to "show",post_path(post.id)%> 23 </td> 24 </tr> 25<% end %> 26</tbody> 27</table> 28<!--テーブル終了--> 29 30<h1>NewBook</h1> 31<!-- form_for部分 --> 32<%= form_for(@post) do |f| %> 33 <h4>title</h4> 34 <%= f.text_field :title %> 35 <h4>body</h4> 36 <%= f.text_area :body %> 37 <%= f.submit 'Create Book' %> 38<% end %>

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

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

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

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

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

guest

回答1

0

ベストアンサー

おそらく routes.rb

rb

1 get 'posts:id' => 'posts#show', as: 'post'

が原因でしょう。

as: 'post' となっているので,post_path が定義されます。
定義から,post_path(1)'/posts/1' ではなく '/posts1' を返すんです。異常ですね。

で,'/posts1 の形で patch なのは routes.rb には存在しません。
patch のは '/posts/:id' とスラッシュが入っていますからね。


以上が回答ですが,routes.rb の書き方がレールに乗っていません。
getpostpatch などを並べるのではなく,

rb

1resources :posts

と書きましょう。カスタマイズしたい点だけ変えればよいのです。

投稿2018/02/25 14:31

scivola

総合スコア2108

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

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

shrimpshrimp

2018/02/25 15:04

指摘していただいた`patch`を`/posts:id`とすることで解決できました!わかりやすくありがとうございました! routes.rbの書き方についてもアドバイスいただきありがとうございます。
scivola

2018/02/25 15:13

揃えるならスラッシュを入れるほうに揃えましょう。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問