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

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

ただいまの
回答率

90.33%

  • Ruby

    8213questions

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

  • Ruby on Rails 5

    2180questions

  • Webサイト

    1131questions

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

  • POST

    242questions

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

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

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 41

shido1218

score 2

前提・実現したいこと

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

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

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

該当のソースコード

config/routes.rb
----------------

Rails.application.routes.draw do
  get 'admin/top' => "administration#top"

  get "/" => "home#top"
  get "about" => "home#about"
  get "terms" => "home#terms"
  get "privacy" => "home#privacy"
  get "index" => "home#index"

  get "posts/index" => "posts#index"
  get "posts/new" => "posts#new"
  get "posts/:id" => "posts#show"

  post "posts/create" => "posts#create"

  get "posts/:id/edit" => "posts#edit"
  post "posts/:id/update" => "posts#update"
  post "posts/:id/destroy" => "posts#destroy"

  devise_for :users


  resources :pages, :only => [:index, :show]
  get "pages/index" => "pages#index"
  resources :messages, :only => [:create]
  resources :rooms, :only => [:create, :show, :index]


  get "users/:id/edit" => "users#edit"
  get "pages/:id" => "pages#show"
  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html

end
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"になっている点までは理解できたのですが、なぜそうなるのかが分かりません

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 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を自動生成

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.33%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Ruby

    8213questions

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

  • Ruby on Rails 5

    2180questions

  • Webサイト

    1131questions

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

  • POST

    242questions

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