大学でRuby on Railsを習いました。
せっかくなのでRuby on Railsを使ってTodoリストを作ってみようと思ったら、早速ルーティングで詰みました。
createのルーティングで詰んでました。
環境
Rails v5.2.4.3
Ruby v2.5.1
やりたかったこと
index.html.erbでform_forメソッドを使いcreateへデータを送信する。
index.html.erbに入力スペースを用意して、そのままデータを作れるようにしたかったんです。
def index
@list = List.new()
end
def create
@list = List.new(params[:list])
if @list.save
redirect_to({ action: :index }, notice: 'やることリストを追加しました')
else
ridirect_to({ action: :index }, notice: 'やることリストを追加できませんでした')
end
end
<%= form_for @list, :url => { action: "create" } do |form| %>
<table>
<tr>
<th><%= form.label :text, "内容" %></th>
<td><%= form.text_field :text %></td>
</tr>
<tr>
<th><%= form.label :deadline_at, "締め切り" %></th>
<td><%= form.datetime_field :deadline_at %></td>
</tr>
</table>
<%= form.submit %>
<% end %>
root "lists#index"
post "lists"
まあ、結論から言うとエラーが出たんです。
controller key on routes definition, please check your routes.
検索しても検索しても、「rootのルーティングを『〇〇/index』にしているので『〇〇#index』にしてください!」みたいなのしかでてこん。
そこはやってたんよ。
なんか、create用のルーティングにcontrollerとactionを書いてあげたら動くようになりました。
post "lists", controller: "lists", action: "create"
とここまで長々とお話ししましたが
気がついたんです。
リソースベースのルーティングってなんかなかったっけ、、、
授業内でcreateのルーティング書いたっけ、、、
はい。
resources :lists
これひとつ書けば、ListsControllerに対してindex
、new
、create
、show
、edit
、update
、destroy
のアクションのルーティングが設定できるんですよね!!
もう完全に忘れていました!!!
と言うか授業で教わったときには意味が全然わかってなくて、今回やっと理解できたと言う感じでしたね、、、復習頑張ります。
この場面ではrootで設定しているindex以外ではcreateしか使っていないので、
root "lists#index"
resources :lists, :only => :create
でも問題なく動作しました。
しかし、これからいろいろ機能をつけていく予定なのでcreate以外も使えるようにしておきます。
はい。
お疲れ様でした!!!