我正在实现三层嵌套表单,您可以在其中看到三层嵌套Task模型的内容,并呈现一个表单以添加新Task。 任务列表正确显示-这表示FET具有有效的特征模型,但不知道为什么意外呈现新任务表单时失败了! 它显示在哪里->
Projects#show中的ActionController :: UrlGenerationError
No route matches {:action=>"index", :controller=>"tasks", :feature_id=>nil}, missing required keys: [:feature_id]
<% @project.features.each do |fet| %>
<div class="card p-2">
<%= "#{fet.name} #{fet.id}" %>
<!-- new Taskform loading is showing problem -->
<%= render :partial => "taskform", :locals => {:feature => fet} %>
<!-- this one is displaying task list properly -->
<div class="card-body">
Tasks:
<% fet.tasks.each do |t| %>
<%= "#{t.name}" %>
<%= "#{t.completed}" %>
<%= "#{t.user_id}" %>
<% end %>
</div>
</div>
<% end %>
我的_taskform.html.erb
标头看起来像->
<%= form_for [feature, feature.tasks.build], method: :post, class: "form-group row" do |builder| %>
(我想其余部分是不相关的,所以我不包括在内)
routes.rb现在是
resources :projects do
resources :features, shallow: true do
resources :tasks
end
end
请帮助我找出显示和创建新内容时行为不明确的可能原因。
NB:我刚刚注意到,在错误消息中,它说No route matches {:action=>"index",
,这是意外的,显然,我试图引用在Feature(form_for [feature, feature.tasks.build]
)下创建新任务的新动作< / p>
答案 0 :(得分:0)
form_for [feature, feature.tasks.build]
抱怨缺少feature_id
值,因为您的路线定义嵌套在项目中,并且您没有通过该项目。
根据您的路线定义,您的路线应为projects/:project_id/features/:feature_id/tasks
。您需要提供两个ID。
form_for [feature, feature.tasks.build]
使用feature.id
作为:project_id
,并将新的taks对象的ID(无,因为未保存)用作您的路线的:feature_id
的值。
要解决此问题,请将嵌套分成两部分:
resources :projects do
resources :features
end
resources :features do
resources :tasks
end
(Rails指南不建议嵌套超过一层。
如果您仍想使用3级嵌套,则将项目传递给form_for助手:
form_for [@project, feature, feature.tasks.build] ...