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

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

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

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

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

Ruby on Rails

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

ルーティング

ルーティングとは、TCP/IPネットワークにおいて、目的のホストまでパケットを送る為のパス選定のプロセスを言います。

Q&A

解決済

1回答

5165閲覧

ユーザー情報の更新(update)をすると、「No route matches [POST] "/users/1"」というルーティングエラーになってしまう

akaki

総合スコア15

Ruby on Rails 5

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

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

Ruby on Rails

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

ルーティング

ルーティングとは、TCP/IPネットワークにおいて、目的のホストまでパケットを送る為のパス選定のプロセスを言います。

0グッド

0クリップ

投稿2020/05/12 14:14

ユーザー情報を更新する機能(updateアクション)を実装しています。「No route matches [POST] "/users/1"」というエラーになってしまうためこのエラーを解決したいです。

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

Routing Error No route matches [POST] "/users/1"

イメージ説明
イメージ説明

該当のソースコード

routes

1Rails.application.routes.draw do 2 devise_for :users 3 root to: "top#index" 4 resources :top, only: :index 5 resources :cafeterias 6 resources :users 7end

edit

1= form_with model: @cafeteria, class: "form", url: user_path(current_user), local: true do |f| 2 = f.text_field :username, placeholder: :名前の変更, class: "form-contents" 3 = f.file_field :profile_image 4 = f.text_area :profile, placeholder: :プロフィール情報を入力してください, class: "form-detail" 5 = f.submit '完了する', class: "form-btn"

controller

1class UsersController < ApplicationController 2 def show 3 @user = User.find(params[:id]) 4 @cafeterias = @user.cafeterias 5 end 6 7 def edit 8 @user = User.find(params[:id]) 9 end 10 11 def update 12 @user = User.find(params[:id]) 13 if @user.update(user_params) 14 redirect_to user_path(@user), notice: "ユーザー情報を更新しました。" 15 else 16 render :edit 17 end 18 end 19 20 private 21 def user_params 22 params.require(:user).permit(:username, :email, :password, :password_confirmation, :profile, :profile_image ) 23 end 24 25end

試したこと

rails routesをすると、updateアクションをした際は「POST」ではなく「PATCH」を呼び込んでいるのが気になりました。
そのため、下記の記述をルーティングに追加して試しましたが何も反応しませんでした。。。

routes

1post "users/:id/update" => "users#update"

どうやってPOSTメソッドを呼び出すことができるでしょうか?よろしくお願いします。

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

rails 5.2.4.2

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

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

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

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

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

guest

回答1

0

ベストアンサー

= form_with model: @cafeteria, class: "form", url: user_path(current_user), local: true do |f|

= form_with model: @cafeteria, class: "form", local: true do |f|

というようにURLを削除してみたらどうなりますか?

form_withは、modelへ渡した@cafeteriaの中身が空ならば新規作成のcreateへ。
中身があればupdateへ自動的に推測してアクションを呼び出してくれる仕様だったと思います。

また、更新処理は本来PATCHで合っていると思います。

詳しくは調べてみてほしいのですが、
確か大抵のブラウザが使うHTTP通信はGETPOSTでの通信しか対応しておらず、
Railsではサーバー側への通信には擬似的にPOSTとしてデータを飛ばし、
飛ばしたデータの中にPATCHであることを示した情報があって更新処理と認識をしてくれると聞いたことがあります。

そのため、Viewファイルではmethod:でメソッド指定をしなければ通常はGETとして通信。
method: :post'とすればpost`で通信となるようです。

削除につかうdeleteも、通信上ではpostとしてデータをとばしますが、実際のmethodとしてはdeleteとして処理されているみたいですね。
https://qiita.com/yusaku_/items/b4b81e54e9dc566056e3

投稿2020/05/12 17:07

gnfreeworks

総合スコア306

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

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

akaki

2020/05/12 23:00

丁寧にありがとうございます! 無事解決しました!ありがとうございます!
gnfreeworks

2020/05/12 23:02

解決して良かったです^^ 引き続き頑張って下さい!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問