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

时间:2014-05-20 22:31:27

标签: ruby-on-rails ruby twitter-bootstrap cocoon-gem

我目前正在使用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 个答案:

答案 0 :(得分:3)

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

不确定是否会导致问题,但我发现您有<div id='tasks'>

虽然在这种情况下我期望的行为是,它显然可以起作用,但它只会保存在第一个中。不完全是你所描述的。

其次:是否有意添加&#34;添加任务&#34;或者&#34;添加目标&#34;为每个孩子?

我会按如下方式编写这些循环:

<%= 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。我发现它使我的观点更具可读性。 的 [/咆哮]