mari-mari
@mari-mari (マリ マリ)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

railsのルーティングエラーについて

Q&A

Closed

解決したいこと

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

発生している問題・エラー

No route matches [POST]"/courses_post"

このようにルーティングエラーが出てしまいます。
https://gyazo.com/4543919389a2af3f98696a8852f75372
ルートの一覧はこうなっています。

該当するソースコード

↓がviewのcourses/new.html.erbです。

<div class="col-sm-6 offset-sm-3">
  <%= form_with(model: @course, local: true) do |f| %>

    <div class"form-group">
      <%= f.label :number, 'Number' %>
      <%= f.text_field :name, class: 'form-control' %>
    </div>

    <div class="form-group">
      <%= f.label :text, 'Text' %>
      <%= f.text_area :text, class: 'form-control' %>
    </div>

    <%= f.submit 'courses_post', class: 'btn btn-primary btn-block' %>
  <% end %>
</div>

↓がroutes.rbです。

Rails.application.routes.draw do
  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
  root to: 'toppages#index'

  get 'login', to: 'sessions#new'
  post 'login', to: 'sessions#create'
  delete 'logout', to: 'sessions#destroy'

  get 'signup', to: 'users#new'

  get 'post', to: 'plans#new'

  get 'courses_post', to: 'courses#new'

  resources :users, only: [:index, :show, :create]

  resources :plans, only: [:index, :show, :create, :destroy]

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

↓がcourses_controllerです。

lass CoursesController < ApplicationController
  before_action :require_user_logged_in, except: [:index, :show]

  def index
    @courses = Course.order(id: :desc)
  end

  def new
    @course = Course.new
  end

  def create
    @plan = plan.find(params[:id])
    @course = @plan.courses.build(course_params)
    if @course.save
      flash[:success] = 'コースを設定しました。'
      redirect_to root_url
    else
      @course = @plan.courses.order(id: :desc)
      flash.now[:danger] = 'コースの設定に失敗しました。'
      render 'toppages/index'
    end
  end

  def destroy
  end

  private

  def course_params
    params.require(:course).permit(:number, :outline)
  end
end

自分で試したこと

routes.rbに

post 'courses_post', to: 'courses#create'

と書いたり、色々試しましたがずっと同じエラーです。

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

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

0

1Answer

新しいcourseを投稿しようとしたときにエラーになっている、ということでよいですか?

No route matches [POST]"/courses_post"

このエラーメッセージは、/courses_post というパスに、POST メソッドでアクセスされたけど、対応するルートがありません、という意味です。

ルートの一覧で、courseに関係するものは3つだけで、その中に上記のパターン POST /courses_post は存在しませんよね。

courses_post_path   GET     /courses_post(.:format)  courses#new
courses_path        POST    /courses(.:format)       courses#create
course_path         DELETE  /courses/:id(.:format)   couses#destroy

新しい投稿をしたいのだとおもうので、呼び出すべきは GET /courses_post ですね。

以下のページを見るとわかるように form_withmethod を指定しないと、デフォルトで POST が使われてしまいます。

今回の対策としては methodGET を指定するようにすればよいと思います。

courses/new.html.erb
  <div class="col-sm-6 offset-sm-3">
-   <%= form_with(model: @course, local: true) do |f| %>
+   <%= form_with(model: @course, local: true, method: :get) do |f| %>

ルーティング全般については、rails ガイドの以下のページが参考になると思います。

0Like

Comments

  1. @mari-mari

    Questioner

    ご指摘いただいた事は理解できました。デフォルトでPOSTになることは知りませんでした。丁寧なご回答、ありがとうございます。
    しかし、質問が悪かったのか、#newのページには行ける(フォーム画面には行ける)のですが、フォームのsubmitボタンを押した後に、エラーになるのです、、、
    なので、POSTでcreateアクションを実行させたいと思い、ルーティングを再度自分で考えてやってみました。すると、「定義ないしメソッドが無い」というエラーが新たに出てきてしまいました。
    ルーティングが問題で、controllerに関してundefined local variable or method等が出ることはあるのでしょうか。それとも全くの別問題なのでしょうか、、、
  2. create をしようとしたときに POST /courses_post がないと言われているということですか?

    それならば、掲示のルーティングに存在する POST /courses を使うようにしたらよいのではないでしょうか。

Your answer might help someone💌