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

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

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

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

POST

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

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

Ruby on Rails

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

ルーティング

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

Q&A

解決済

1回答

847閲覧

Railsでのルーティングエラーを解消したい。

mari_

総合スコア2

Ruby

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

POST

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

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

Ruby on Rails

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

ルーティング

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

0グッド

1クリップ

投稿2021/04/23 15:36

railsで投稿サイトを作っています。
現在planを投稿できる状態になっているのですが、それとは別にcourseも投稿できるようにしたいです。
そこでまた新たにform_withを使ってcourseの投稿フォームを作成しました。投稿ページのURLは"/courses_post"です。

しかし、

No route matches [POST]"/courses_post"
とルーティングエラーが出てしまいます。

ルート一覧はこうなっています。

###該当するソースコード
↓がviewのcourses/new.html/erbです。

view/courses/new.html.erb

1 2<div class="col-sm-6 offset-sm-3"> 3 <%= form_with(model: @course, local: true) do |f| %> 4 5 <div class"form-group"> 6 <%= f.label :number, 'Number' %> 7 <%= f.text_field :name, class: 'form-control' %> 8 </div> 9 10 <div class="form-group"> 11 <%= f.label :text, 'Text' %> 12 <%= f.text_area :text, class: 'form-control' %> 13 </div> 14 15 <%= f.submit 'courses_post', class: 'btn btn-primary btn-block' %> 16 <% end %> 17</div>

↓がroutes.rbです。

routes.rb

1Rails.application.routes.draw do 2 root to: 'toppages#index' 3 4 get 'login', to: 'sessions#new' 5 post 'login', to: 'sessions#create' 6 delete 'logout', to: 'sessions#destroy' 7 8 get 'signup', to: 'users#new' 9 10 get 'post', to: 'plans#new' 11 12 get 'courses_post', to: 'courses#new' 13 14 resources :users, only: [:index, :show, :create] 15 16 resources :plans, only: [:index, :show, :create, :destroy] 17 18 resources :courses, only: [:create, :destroy] 19end

↓がcourses_controllerです。

courses_controller

1 2lass CoursesController < ApplicationController 3 before_action :require_user_logged_in, except: [:index, :show] 4 5 def index 6 @courses = Course.order(id: :desc) 7 end 8 9 def new 10 @course = Course.new 11 end 12 13 def create 14 @plan = plan.find(params[:id]) 15 @course = @plan.courses.build(course_params) 16 if @course.save 17 flash[:success] = 'コースを設定しました。' 18 redirect_to root_url 19 else 20 @course = @plan.courses.order(id: :desc) 21 flash.now[:danger] = 'コースの設定に失敗しました。' 22 render 'toppages/index' 23 end 24 end 25 26 def destroy 27 end 28 29 private 30 31 def course_params 32 params.require(:course).permit(:number, :outline) 33 end 34end

###自分で試したこと
routes.rbに

post 'courses_post', to: 'courses#create'
と書いたり、色々試しましたがずっと同じエラーです。

ちなみに最終的にはプランとコースを一対多にするつもりです。クックパッドの料理の手順のように、一つのプランに対してコース1,コース2があるような感じです。
その場合、投稿フォームをどのようにしたらよいのでしょうか。こちらももしお分かりであれば教えてください。

初学者なため根本的な間違いをしているかもしれません。少しでもわかることがあれば、どうかお力をお貸しください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

こんにちは。
今回の問題の対処方法としてはroutes.rbの一番上に post 'courses_post', to: 'courses#create' と記載すれば解決するのではないかなと思うのですが、根本の解決をした方が良いのでその話をさせてください!

Railsでの開発において、ルーティングは基本的にはresourcesを使う方が良いです。実装時にresourcesで解決できないかをまず検討し、どうしてもだめな場合のみgetやpostなどを記載するようにしてください(それでもそうそう起こり得ないと思います。)
今回の問題の場合get 'cources_post' は使わずに、以下のように編集するのが良いです。

resources :courses, only: [:new, :create, :destroy]

おそらくこれだけで今回の問題は解決するのではないかなと思います。

なぜresourcesを使うか?を簡単に説明すると、Railsの一般的な記述方法であり、コード量が少なくシンプルに実装でき、シンプルに実装できるということはバグにぶつかることも減り、Railsの一般的な記述方法ということは他のエンジニアが読むことも簡単になるからです。
より厳密に説明するとRESTの原則に従うことができることもありますが、ルーティングについては詳しくはこちらを読むのが良いかと思います。https://railsguides.jp/routing.html

投稿2021/04/24 12:33

MH4GF

総合スコア29

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

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

mari_

2021/04/27 14:53 編集

ご回答、ありがとうございます。 バグにぶつかりにくい記述の仕方も教えて下さり、感謝します。 教えていただいたようにresourcesを活用したいと思うのですが、新たなエラーが出てきたりと、なかなかうまくいきません。 しかし、有益な情報をいただけて良かったですし、これを読む方々のためにもなると思いますので、ベストアンサーとして、とりあえず解決済みとさせていただきます。 お時間を頂戴し、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問