Rails中的三重嵌套模型形式显示错误

时间:2019-08-16 15:37:22

标签: ruby-on-rails forms model ruby-on-rails-5 associations

我正在实现三层嵌套表单,您可以在其中看到三层嵌套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>

1 个答案:

答案 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] ...