首页 > 解决方案 > 导轨中的三重嵌套模型形式显示错误

问题描述

我正在实现三重嵌套表单,您可以在其中看到我还显示了三重嵌套任务模型的内容,并呈现了一个表单以添加新任务。任务列表显示正确 - 这意味着 fet 具有有效的特征模型,但不知道为什么它在意外渲染新任务表单时失败!它显示的位置->

项目中的 ActionController::UrlGenerationError#show

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

请帮助我找出在显示和创建新的 .

注意:我刚刚注意到在错误消息中 - 它说 No route matches {:action=>"index", 这是意外的,显然我试图引用在 Feature( form_for [feature, feature.tasks.build])下创建新任务的新操作

标签: ruby-on-railsformsmodelruby-on-rails-5associations

解决方案


form_for [feature, feature.tasks.build]抱怨缺少feature_id值,因为您的路线定义嵌套在项目中,并且您没有传递项目。

根据您的路线定义,您的路线应该是 something projects/:project_id/features/:feature_id/tasks。您需要提供两个 ID。

form_for [feature, feature.tasks.build]正在使用feature.idas:project_id和新的 taks 对象的 id(nil,因为它没有保存)作为: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] ...

推荐阅读