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

Posted

技术标签:

【中文标题】导轨中的三重嵌套模型形式显示错误【英文标题】:Triply nested model's form in rails showing error 【发布时间】:2019-08-16 15:37:22 【问题描述】:

我正在实现三重嵌套表单,您可以在其中看到我还显示了三重嵌套任务模型的内容,并且还呈现了一个表单以添加新任务。 任务列表显示正确 - 这意味着 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

请帮助我找出在显示和创建新的时行为模棱两可的可能原因。

N.B:我刚刚注意到在错误消息中 - 它说 No route matches :action=&gt;"index", 这是出乎意料的,显然我试图引用新操作以在功能下创建新任务(form_for [feature, feature.tasks.build]

【问题讨论】:

【参考方案1】:

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

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

要解决这个问题,请将嵌套一分为二:

resources :projects do
  resources :features
end
resources :features do
  resources :tasks
end

(rails 指南不鼓励多层嵌套。

如果你还想使用 3 级嵌套,那么将项目传递给 form_for 助手:

form_for [@project, feature, feature.tasks.build] ...

【讨论】:

以上是关于导轨中的三重嵌套模型形式显示错误的主要内容,如果未能解决你的问题,请参考以下文章

如何正确转义 JSP 标记中的三重嵌套引号

三重嵌套循环中的这条语句执行多少次?

导轨中的多个连接

递增循环是 R 中三重嵌套循环的正确方式

显示使用回形针导轨上传的文档

在 Backbone.js 的显示视图中嵌套创建视图