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

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

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

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

Ruby on Rails

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

Q&A

解決済

1回答

1411閲覧

No route matches [POST] "/mypages/1/edit" エラーを解決しフォームの内容をデータに保存したい。

gaffai

総合スコア1

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2020/07/16 15:07

編集2020/07/17 02:59

前提・実現したいこと

Ruby on rails で体重管理アプリを作っています。
form_withメソッドを使って入力した内容を保存または更新をするためにform_with model:@変数名 で記述しsubmitボタンを押したところ下記のエラーが発生しました。
ビューにデータを表示させる前にまずはフォームの内容をfeaturesテーブルに保存したいと考えております。

半日かけて調べたりコードをいじりましたが解決できませんでした。
学習を始めてまだ1ヶ月のひよっこですが、ご指導ご鞭撻の程よろしくお願いいたします。

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

Routing Error No route matches [POST] "/mypages/1/edit"

該当のソースコード

ruby

1#config/routes.rb 2 3Rails.application.routes.draw do 4 devise_for :users 5 root "toppages#index" 6 resources :users, only: [:edit, :update, :index] 7 resources :messages, only: [:index, :create, :new] 8 resources :mypages, only: [:index, :new, :create, :edit, :update] 9end

ruby

1#mypages_controller.rb 2 3class MypagesController < ApplicationController 4 def index 5 @chart = [['7月9日', 70], ['7月10日', 75], ['7月11日', 80],['7月12日', 65]] 6 @features = Feature.all 7 end 8 9 def new 10 @feature = Feature.new 11 end 12 13 def create 14 Feature.create(feature_params) 15 end 16 17 def edit 18 @feature = Feature.find_by_id(params[:id]) 19 unless @feature then 20 render :edit 21 end 22 end 23 24 def update 25 @feature = Feature.find(params[:id]).update(feature_params) 26 end 27 28 private 29 30 def feature_params 31 params.require(:feature).permit(:length, :weight, :age, :goalweight, :goaldate).merge(user_id: current_user.id) 32 end 33 34 35end

ruby

1#app/views/mypages/edit.html.haml 2#app/views/mypages/new.html.haml 3 4.Main__Contents 5 = form_with model: @feature, local: true do |f| 6 = f.number_field :length, placeholder: '身長' 7 = f.number_field :weight, placeholder: '体重' 8 = f.number_field :age, placeholder: '年齢' 9 = f.number_field :goalweight, placeholder: '目標体重' 10 = f.datetime_field :goaldate, placeholder: '目標日' 11 = f.submit '送信'

ruby

1#app/views/mypages/index.html.haml 2 3.UpperContents 4 .UpperContents__userName 5 = current_user.name 6 .UpperContents__topmessage 7 体重の変化 8 .UpperContents__edit 9 = link_to edit_user_path(current_user) do 10 = icon('fas', 'cog') 11 .UpperContents__information 12 = link_to edit_mypage_path(current_user) do #今回のリンク先 13 情報 14= line_chart @chart, width: "900px", height: "500px" 15.BottomContents 16 = render partial: "feature", collection: @features 17.BottomMain 18 %form.BottomMain__Weight 19 %input.weightBtn{url: '#', type: 'number', placeholder: '今日の体重を入力'} 20 %input.submitBtn{url: '#', type: 'submit', value: '登録する'}
#rails routes root_path GET / toppages#index users_path GET /users(.:format) users#index edit_user_path GET /users/:id/edit(.:format) users#edit user_path PATCH /users/:id(.:format) users#update PUT /users/:id(.:format) users#update messages_path GET /messages(.:format) messages#index POST /messages(.:format) messages#create new_message_path GET /messages/new(.:format) messages#new mypages_path GET /mypages(.:format) mypages#index POST /mypages(.:format) mypages#create new_mypage_path GET /mypages/new(.:format) mypages#new edit_mypage_path GET /mypages/:id/edit(.:format) mypages#edit mypage_path PATCH /mypages/:id(.:format) mypages#update PUT /mypages/:id(.:format) mypages#update

試したこと

rails routesコマンドで該当のコントローラーとアクションを確認しましたがPOSTメソッドに対応する記述がないことを確認。form_withメソッドはデフォルトがPOSTなので対応したHTTPメソッドを指定する必要があるのかと思い、method: getと記述しましたがnameエラーが出てしまいました。

ルーティングに問題があると思い、ネストしたり色々試みましたが結果は変わらず。

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

ruby '2.6.5'
rails '6.0.0'
mysql2 '0.4.4'

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

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

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

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

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

guest

回答1

0

ベストアンサー

ちょっと解せない動きですが、気になるのは
実体が Feature、MyPageの実体は無いのに resources :mypages があってresources :features がない。
Myapge のリソース(DB table)ってないですよね、、、、

resources :features で mypages_controller を向くようにする
のかなと思うのです。

投稿2020/07/17 01:50

winterboum

総合スコア23567

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

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

gaffai

2020/07/17 02:52

Mypageのリソースはありません。 resources:featuresをルーティングに追加し、リンク先をedit_mypage_pathに設定するということでしょうか。理解が未熟ですいません。試しましたが結果は同じでした。 思ったのですが、Featureの情報を新規登録(new,create)または更新(edit, update)するためのページのリンク先がedit_mypage_pathなのですがこれで合っているのでしょうか。 新規登録と編集ページを分けて作った方が良いのでしょうか。
winterboum

2020/07/17 03:48

model: @feature としたときに *_mypage_path と言うのが気になりますが、(Railsが期待通りに判断してくれるかどうか、が)仮によいとして new の画面を出すのは GET の mypage_path, edit の画面を出すのは GET の edit_mypage_path その画面からのsubmitをうけとるのは new からは POST の mypage_path edit からは PATCH の mypage_path(ですがPOSTで済ませることも) が標準です。
gaffai

2020/07/17 08:58

なるほど。ありがとうございます。 今回の場合解決の糸口はどこにあると考えれば良いのでしょうか?
winterboum

2020/07/17 10:56

スマートな解が他に有るかもしれませんが、私の知識の範囲ですと URLをmypageにするのを諦めて resqouces :features にし、controllerをFeatuersに書き直す、というのが一つ URLをmypagesにしたいとすると mypage_path PATCH /mypages/:id(.:format) はできているので、 = form_with model: @feature, local: true がそっちを向くようにすれば良いわけですが、問題がふたつ 1.@feature とがDBに既に有るか否かで createへのPOSTとupdateへのPATCHをかき分けてくれるはずがそうなっていない 2. すると、form_with に methodとURLを追加する。  ですがこの場合newとeditでviewを分ける必要が出てくるのと  form_withって model: と url: と2つ書けたっけ、、、、
gaffai

2020/07/19 04:39

resoucesをfeatures, controllerをFeaturesに書き直したところ、無事に解決することができました! ただnewとeditでviewを分け、editのform_withにはurl: feature_pathとmethod: :patchを追記した上でですが。form_withの使い方は未だ謎に包まれたままですがこれで先に進むことができそうです。 ありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問