我有學生和模型清單,每個學生都有很多清單。我一直在嘗試更改默認腳手架以使用淺路由。我通過根據操作設定清單和學生來由控制器修復,這似乎有效。但是我遇到了_form部分問題,因為我不知道要更改什么 - 雖然我可以在嵌套路由的表單上找到東西,但對于淺層路由沒有這樣的幫助。
<%= form_with(model: [@student, checklist]) do |form| %>
<% if checklist.errors.any? %>
<div style="color: red">
<h2><%= pluralize(checklist.errors.count, "error") %> prohibited this checklist from being saved:</h2>
<ul>
<% checklist.errors.each do |error| %>
<li><%= error.full_message %></li>
<% end %>
</ul>
</div>
<% end %>
<div>
<%= form.label :title, style: "display: block" %>
<%= form.text_field :title %>
</div>
<div>
<%= form.label :date, style: "display: block" %>
<%= form.date_field :date %>
</div>
<div>
<%= form.label :setting, style: "display: block" %>
<%= form.text_field :setting %>
</div>
<div>
<%= form.submit %>
</div>
<% end %>
uj5u.com熱心網友回復:
你真的不需要做太多的事情來讓表單與嵌套路由一起作業。
當您使用form_with它時,它會將引數傳遞給多型路由助手,這將在嘗試找到相應的路由時壓縮陣列:
# method | path
form_with(model: [Foo.find(1), Bar.new]) # POST | foo_bars_path(foo_id: 1)
form_with(model: [nil, Bar.new]) # POST | bars_path
form_with(model: [Foo.find(1), Bar.find(2)]) -> # PATCH | foo_bars_path(foo_id: 1, id: 2)
form_with(model: [nil, Bar.find(1)]) -> # PATCH | bar_path(1)
陣列的最后一個元素被視為由表單構建器包裝的實際物件。在處理淺嵌套時,您只需確保在更新記錄時不傳遞父記錄。
您可以通過在部分中使用單個“本地”來做到這一點:
<%= form_with(model: model) %>
# new.html.erb
<%= render partial: 'form', model: [@student, @checklist] %>
# edit.html.erb
<%= render partial: 'form', model: @checklist %>
或者,如果沒有傳遞本地,您可以使用local_assigns哈希訪問本地而不引發 NoMethodError:
<%= form_with(model: [local_assigns[:student], checklist]) %>
# new.html.erb
<%= render partial: 'form', student: @student, checklist: @checklist %>
# edit.html.erb
<%= render partial: 'form', checklist: @checklist %>
這是因為區域變數不是實際的區域變數——相反,傳遞的區域變數存盤在哈希中,Rails 通過元編程動態地提供訪問器。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/440697.html
上一篇:非阻塞反引號
