我目前正在使用 cocoon gem 和 bootstrap/simple_form 一起处理我的嵌套表单。我的模型布局如下:
- 联系人
has_many
目标 - 一个目标
有_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 添加了必要的包装器选项。预先感谢您抽出时间帮助我。
最佳答案
这听起来像是一个 html/javascript 问题。我刚刚在 cocoon issues 上发布了一个类似的问题,所以听起来像是使用 id 而不是 class 来处理重复的事情。
不确定这是否会导致问题,但我看到您有一个 <div id='tasks'>
.
虽然在那种情况下我期望的行为是在它显然有效的形式中,但它只会在第一个中被保存。不完全是你所描述的。
其次:是否有意给每个 child “加任务”或“加目标”?
我会按如下方式编写这些循环:
<%= 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]
关于ruby-on-rails - Rails 4 & 茧 gem : Cannot add 3rd level child to dynamically added 2nd level child,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23771073/