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

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

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

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

Ruby

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

POST

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

Webサイト

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

Q&A

1回答

912閲覧

railsで投稿機能,routeエラーの対応

shido1218

総合スコア10

Ruby on Rails 5

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

Ruby

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

POST

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

Webサイト

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

0グッド

0クリップ

投稿2018/12/05 04:27

編集2022/01/12 10:55

前提・実現したいこと

Rails 5.2.1にて開発しています。
ここに質問の内容を詳しく書いてください
railsでウェブサービスを作っていて投稿機能を実装しようとしています。
その投稿機能を実装中に以下のエラーメッセージが発生しました。

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

No route matches [POST] "/posts/new"

該当のソースコード

rails

1config/routes.rb 2---------------- 3 4Rails.application.routes.draw do 5 get 'admin/top' => "administration#top" 6 7 get "/" => "home#top" 8 get "about" => "home#about" 9 get "terms" => "home#terms" 10 get "privacy" => "home#privacy" 11 get "index" => "home#index" 12 13 get "posts/index" => "posts#index" 14 get "posts/new" => "posts#new" 15 get "posts/:id" => "posts#show" 16 17 post "posts/create" => "posts#create" 18 19 get "posts/:id/edit" => "posts#edit" 20 post "posts/:id/update" => "posts#update" 21 post "posts/:id/destroy" => "posts#destroy" 22 23 devise_for :users 24 25 26 resources :pages, :only => [:index, :show] 27 get "pages/index" => "pages#index" 28 resources :messages, :only => [:create] 29 resources :rooms, :only => [:create, :show, :index] 30 31 32 get "users/:id/edit" => "users#edit" 33 get "pages/:id" => "pages#show" 34 # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html 35 36end
app/controllers/posts_controller.rb -------------------------- def new end def create @post = Post.new( content: params[:content], user_id: current_user.id, reward: params[:reward], university_name: params[:university_name], group_name: params[:group_name], entry_qualification: params[:entry_qualification], start_date: params[:start_date], finish_date: params[:finish_date], experiment_period_datail: params[:experiment_period_datail], recruit_deadline: params[:recruit_deadline], experiment_location: params[:experiment_location], experiment_location_detail: params[:experiment_location_detail], recruit_way: params[:recruit_way], recruit_detail: params[:recruit_detail], reward_detail: params[:reward_detail], remark: params[:remark] ) @post.save redirect_to("/posts/index") end
app/views/posts/new.html.erb ----------------------------- <div class="main posts-new"> <div class="container"> <h1 class="form-heading">投稿する</h1> <%= form_for("/posts/create") do |f| %> <div class="form"> <div class="form-body"> <%= f.label :"" %><br> <%= f.text_field :university_name %> <%= f.label :"" %><br> <%= f.text_field :group_name %> <%= f.label :"" %><br> <textarea name="content"> </textarea> <%= f.label :"" %><br> <textarea name="entry_qualification"> </textarea> <label class="control-label" for="experiment_period"></label><br> <%= f.label :"" %><br> <%= f.date_select :start_date, {}, class: 'form-control' %><br> <%= f.label :"" %><br> <%= f.date_select :finish_date, {}, class: 'form-control' %><br> <%= f.label :"" %><br> <textarea name="experiment_period_datail"> </textarea> <label class="control-label" for="recruit_deadline"></label><br> <%= f.date_select :recruit_deadline, {}, class: 'form-control' %><br> <%= f.label :"" %><br> <%= f.select :experiment_location,Post.experiment_locations.keys, {prompt: '選択してください'}, class: 'form-control btn btn-info' %><br> <%= f.label :"" %><br> <textarea name="experiment_location_detail"> </textarea> <%= f.label :"" %><br> <%= f.select(:reward, [["",""],["",""],["",""]]) %><br> <%= f.label :"" %><br> <textarea name="reward_detail"> </textarea> <%= f.label :"" %><br> <textarea name="recruit_way"> </textarea> <%= f.label :"" %><br> <textarea name="recruit_detail"> </textarea> <%= f.label :"" %><br> <textarea name="remark"> </textarea> <input type="submit" value="投稿"> </div> </div> <% end %> </div> </div>

試したこと

routes.rb、posts_controller.rbを自分なりに見直しましたが、どこが間違っているかわかりませんでした。
[POST] "/posts/create" になるはずが、
[POST] "/posts/new"になっている点までは理解できたのですが、なぜそうなるのかが分かりません

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

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

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

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

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

guest

回答1

0

form_for は一般的にモデルを操作する際に使用するformヘルパとなりますので form_forの引数にはモデルオブジェクト(インスタンス)を渡す必要がございます。
Postモデルがあるとしますと新規Post作成のフォームは以下のようになるかと思います。

<%= form_for(Post.new) do |f| %>

この記述で作成されるHTMLは

<form action="/posts" method="POST">

といったものになります。
このように新規オブジェクトが渡された場合、action属性がモデルの複数形のurl、HTTPメソッドがPOSTになるようにRailsでは設計されていますのでこのルートも作成してあげる必要があります。

post "posts/new" => "posts#new"

しかし、このような基本的なルートを作成する際には resourcesを使用したルーティングの方が見通しが良いコードが書けます。

resources :posts

以下を参考にして学習してみてください。

リソースベースのルーティング
RESTfulなURLを自動生成

投稿2018/12/16 23:54

ykp_yk

総合スコア654

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問