Rails 4 & cocoon gem:无法将 3 级子级添加到动态添加的 2 级子级

Posted

技术标签:

【中文标题】Rails 4 & cocoon gem:无法将 3 级子级添加到动态添加的 2 级子级【英文标题】:Rails 4 & cocoon gem: Cannot add 3rd level child to dynamically added 2nd level child 【发布时间】:2014-07-09 09:08:00 【问题描述】:

我目前正在使用 cocoon gem 和 bootstrap/simple_form 来处理我的嵌套表单。我的模型布局如下:

联系人has_many 目标 一个目标has_many任务 一个任务has_one 提醒(尚未实现,这是我解决此问题后的下一个)

我的表单布局正确,目标字段构建正确,我可以毫无问题地向我的第一个目标添加/删除任务。但是,当我动态添加另一个目标时(无论它是在新建还是编辑操作中),我无法向其中添加/删除任务(如果我单击“添加任务”,它只会添加到我的第一个目标中)。以下是我的表格:

_form.html.erb

<%= simple_form_for(@contact) do |f| %>

  <% if @contact.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@contact.errors.count, "error") %> prohibited this contact from being saved:</h2>
      <ul>
      <% @contact.errors.full_messages.each do |message| %>
        <li><%= message %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <%= f.input :name %>
  <%= f.input :title %>
  <%= f.input :company %>
  <%= f.input :email %>
  <%= f.input :notes %>

  <h3>Goals:</h3>
  <div id="goals">
    <%= f.simple_fields_for(:goals) do |goal| %>
    <%= render 'goal_fields', :f => goal %>
      <div class="links">
        <%= link_to_add_association 'add goal', f, :goals, :render_options => :wrapper => 'bootstrap'  %>
      </div>
    <% end %>
  </div>

  <%= f.submit :submit %>

<% end %>

_goal_fields.html.erb

<div class="nested-fields">

  <%= f.input :title %>
  <%= f.input :due_date %>
  <%= f.input :notes %>

  <%= link_to_remove_association "remove goal", f %>

    <h4>Tasks:</h4>
    <div id="tasks">

      <%= f.simple_fields_for(:tasks) do |task| %>
      <%= render 'task_fields', :f => task %>
        <div class="links">
          <%= link_to_add_association 'add task', f, :tasks, :render_options => :wrapper => 'bootstrap'  %>
        </div>
      <% end %>
    </div>
</div>

task_fields.html.erb

<div class="nested-fields">

  <%= f.input :task_type %>
  <%= f.input :date_of_task %>
  <%= f.input :complete, as: :boolean, checked_value: true, unchecked_value: false %>

  <%= link_to_remove_association "remove task", f %>

</div>

我已经检查了我的代码以确保我使用了正确的 div 类和 id,但我确信我的表单某处存在问题。我还为 simple_form/bootstrap 添加了必要的包装器选项。预先感谢您抽出宝贵时间帮助我。

【问题讨论】:

【参考方案1】:

这听起来像是一个 html/javascript 问题。我刚刚在茧问题上发布了一个类似的问题,所以听起来像是使用 id 而不是类来重复的事情。

不确定这是否会导致问题,但我看到您有一个&lt;div id='tasks'&gt;

虽然在这种情况下我期望的行为是它显然有效的形式,但它只会在第一个中保存。和你描述的不完全一样。

其次:是否有意为每个孩子设置“添加任务”或“添加目标”?

我会将这些循环编写如下:

<%= f.simple_fields_for(:tasks) do |task| %>
  <%= render 'task_fields', :f => task %>
<% end %>
<div class="links">
  <%= link_to_add_association 'add task', f, :tasks, :render_options => :wrapper => 'bootstrap'  %>
<% end %>

[咆哮] 我应该再次尝试推广haml吗?我看到人们在使用 erb 时犯了很多错误,它变得很乱(你的缩进很混乱),我有时真的不明白为什么更多的人使用 haml 或 slim。我发现它使我的观点更具可读性。 [/rant]

【讨论】:

+1 用于 HAML 建议 ;) @nathanvda 问题源于在循环中包含链接。这是代码的要点:gist.github.com/nowgeez/a6e2ae91b5164accb968。此外,您对 HAML 的推广效果很好,我会尽力将其合并到我的应用程序中,因为它肯定看起来更干净(仍在尝试掌握 ruby​​/rails!)。感谢您再次提供帮助,干杯! @nzifnab link_to_add_association 不确定为什么它在 heroku 中不起作用! @nourza 您的资产构建正确吗?也许最好在一个单独的问题中问这个?

以上是关于Rails 4 & cocoon gem:无法将 3 级子级添加到动态添加的 2 级子级的主要内容,如果未能解决你的问题,请参考以下文章

在 Ruby on Rails 4.2 中使用 Cocoon gem 嵌套表单

<ol> <li> 使用 rails partial 和 cocoon gem 实现的问题

Rails 4 with Pundit & Statesman gem - 对象处于状态时的策略

cocoon link_to_add_association 添加空关联字段 rails 4 erb

Cocoon gem,编辑或错误时未建立深度关联

如何将复制按钮集成到使用 cocoon gem 创建的表单中