proguradk
@proguradk

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

rails route form_with うまくいかない

解決したいこと

allplanテーブルの中にデータを格納、この中身の追加、一覧表示ができるindex.htmlを制作しています。
form_withがうまく動きません。
何度試してもうまくいかず行き詰っていますどなたか助けていただけないでしょうか?

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

undefined method `allplans_path' for #<#<Class:0x000001de39d0a408>:0x000001de39d222d8>

モデル名
allplan
カラム
dec-dateid
dec-date

コントローラ名
plan

コントローラアクション
index
show

plan_controller.rb

class PlanController < ApplicationController

  def index
    @allplans = Allplan.all
    @allplan = Allplan.new
  end
  def create
    @allplan = Allplan.new(allplan_params)
    if @allplan.save
      redirect_to plan_path(@allplan)
    end
  end

  def show
  end

  private
    def plan_params
      params.require(:allplan).permit(:dec_dateid, :dec_date)
    end
end

index.html.erb

<h1>スタート</h1>

<% @allplans.each do |plan| %>
  <%= plan.id %>
<% end %>

<%= form_with(model: @allplan, local: true) do |f| %>

  <h4>Title</h4>
  <%= f.text_field :dec_dateid %>

  <h4>Body</h4>
  <%= f.text_area :dec_date %>

  <p>
    <%= f.submit 'create book' %>
  </p>



<% end %>


migrationファイル

class CreateAllplans < ActiveRecord::Migration[5.2]
  def change
    create_table :allplans do |t|
      t.integer :dec_dateid
      t.string :dec_date

      t.timestamps
    end
  end
end

routes.rb

Rails.application.routes.draw do
  root 'plan#index'
  # get 'plan/index'
  # # post 'plan/new'
  # get 'plan/show'
  resources :plan
  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
end
0

6Answer

allplans_pathというrouteが存在していないはずです。

$ rails routes

として、思っているrouteが表示されるか確認してみるといいかも。

1Like

Comments

  1. @proguradk

    Questioner

    存在していません。しかし、なぜ定義しないといけないかがよくわかっていなくて、コントローラ名とルート名は合わせるものではないのでしょうか??
  2. https://railsguides.jp/routing.html

    残念ながらrailsは参考書をちらっと見たぐらいでは全体が把握出来るような規模のライブラリではないので、公式のドキュメントをざっくりでも一度全部読むぐらいの気持ちは必要です。

    > なぜ定義しないといけないかがよくわかっていなくて

    routes.rb
    に書かれていないと、パスは存在しないのでアクセスできません。
  3. @proguradk

    Questioner

    ご丁寧に回答ありがとうございます。
    routes.rbに書かれていないと、パスは存在しないのでアクセスできないのは承知です。
    ですのでplanコントロールを作成し、もでるとviewをつないでいます。このコントローラ内でallplanモデルを取得、変更したいと考えているためallplanというルートを指定する必要性がわからないという意味になります。
    どちらかというとform_withで飛ばされるルートがなぜall_plan_pathなのかという質問の仕方のほうが正しいかもしれません。説明がへたくそで申し訳ございません、伝わりますでしょうか??
  • モデル名がAllplan
  • routesにはresources :plan

ここを読むと分かると思います。

routes -> pathがある -> controllerとactionが決まる -> controllerのactionへ遷移 -> actionがrender -> viewへ遷移 -> ...

と全体的な流れの把握が必要なので、ここで単に...とすると動きますよと言っても解決しません。

1Like

RESTfulなリソースを扱っている場合、レコード識別(record identification)を使うとform_forの呼び出しがはるかに簡単になります。

1Like

form_withで飛ばされるルートがなぜall_plan_pathなのか

モヤッとしていて言わんとしていることは分からなくもないです、が…一応

先に、長文になることをお詫びします。
(本当に全てを正確に回答すると到底この量でも収まらないことを御了承ください)

[前提及び提案]
既に@github0013@githubさんが回答されている通り
Railsの構成について(特にルーティングについて)
もう一度理解を深めてみてはどうでしょうか。

貼られている公式ドキュメント以上に確実な情報はないので
蛇足かもしれませんが以下、[私的見解]にて補足的に回答させていただきます。

[私的見解]
恐らく、RailsのMVCを作成して必要なルーティングはしている「はず」なのに
予想だにしない「allplans_path」とやらが
急に出てきて原因や定義する必要があるのか分からない、
という話ではないかと予想しての回答です。

form_withタグに「(model: @allplan, ~)」と
「モデルを渡した時にRailsが解釈(パスを生成)する仕組みがわからない」から
「allplanに関わるルーティングの必要性がわからない(そもそも使っていないのに)」という
基本的な部分で詰まっているように見受けられます。

ですので、情報が多く煩雑に見えますが、「信用できる情報」なので
公式ドキュメントを読んでみることをオススメします。
(「form_with model」や上記なにかしらのワードにアタリをつけて)

もし公式ドキュメントに嫌気が差したら、情報の取捨選択が必要ですが
「Railsバージョン form_with モデル」などのワードでググってみると良いかと思います。

仮にですが、公式ドキュメント読んだ上で、更に
「書いてあることは完全に理解できたけど、結局それは何で?」といった
Railsの根本に迫る話になるのであれば、
開発したスーパーエンジニアレベルでないと
分からないのでGitHubで公開されているRailsのソースをご覧になるか
開発者に問い合わせる事をオススメします。

これ以上は記事を書くレベルになる恐れがあるので、長文ですがここで抑えます。

解決の糸口が見つかれば幸いです。

1Like

This answer has been deleted for violation of our Terms of Service.

Your answer might help someone💌