Rails嵌套表单-动态添加的项全部获取零索引



我的嵌套表单有问题。我正在使用Ryan Bates的代码。Gemfile片段:

gem"nested_form",:git=>'https://github.com/ryanb/nested_form.git'

问题是,当我尝试使用*link_to_ad*时,我会得到一个看起来正常的新项,但它不起作用,因为它得到了一个0的新索引,而不是基于nested_form.js应该生成的当前时间的"随机"索引。我添加的每个项都获得相同的0索引。因此,效果是我无法添加新项目(或者只保存最后一个新项目,这取决于模型的原始状态)。

新的父对象和编辑父对象时的行为相同。

我很确定我做错了什么,因为我能够做一个简单的新应用程序。但我不知道我的真实应用程序出了什么问题。

为我的(工作的)测试应用程序和我的(不工作的)真实应用程序生成的nested_form.js是相同的。所以我认为版本差异没有问题。

我使用Firebug逐步浏览了nested_form.js中的代码,但不明白它为什么在那里生成0索引。

我的父模型有这个:

课堂课程<ActiveRecord::基本

accepts_nested_attributes_for :levels, :allow_destroy => true
has_many :levels, :dependent => :destroy, :order => :depth

我的表单是这样实例化的:

<%= nested_form_for(@course) do |f| %>

带有嵌套对象的部分如下所示:

<%= f.fields_for :levels do |builder| %>
    <tr>
        <td><%= builder.text_field :name %></td>
        <td><%= image_tag(builder.object.icon) unless (builder.object.icon.nil?) %></td>
        <td><%= builder.link_to_remove "Remove" %></td>
    </tr>
<% end %>
   <tr><td><%= f.link_to_add "Add a level", :levels %></td></tr>

我看不出我的代码和我的工作示例(或我看到的其他示例)之间有任何区别。

有人有什么想法吗?

更新:

在Firebug中调试了更多之后,我意识到nested_form.js中addFields函数使用的"蓝图"在addFields方法中发生了变化,这就是为什么它没有放入生成的索引(在我的测试应用程序中绕过了该块)。因此,我通过更改来覆盖发生这种情况的块:

if (context) {

至:

if (false)

这似乎从初步测试中解决了我的症状,但我感觉到在某些情况下(NPI),这可能破坏了其他东西(可能有多个嵌套级别?)。

虽然我觉得有点傻,但我认为这可能发生在其他人身上(我在问题中确实说过我可能做错了什么)。

我做的"错误"是,我使用字段集来隔离表单中的区域。我给字段集类"字段"。不好。与表单生成器的类冲突。

当我的父对象没有自己的任何字段时,我遇到了类似的情况:

Carousel has_many Items
<%= f.inputs 'Carousel' do %>
<!-- NOTICE NO FIELDS HERE -->
  <f.fields_for :items, allow_destroy: true do |it| %>
    <%= it.input :media_hash %>
    <%= it.link_to_remove 'Remove item' %>
  <% end %>
  <%= f.link_to_add 'Add item', :items %>
<% end %>

通过在父对象上添加一个字段,可以正确地创建索引。在我的情况下,我只是将f.input :created_at, as: :hidden添加到我的旋转木马中。

我有完全相同的问题(在更新时,而不是创建),除了html中"字段"类的唯一实例是由fields_for helper生成的,所以我非常沮丧。

我花了将近一整天的时间浏览javascript,但没有理由用无效的"0"索引替换"new_"字符串。

我的破解方法是在内容编辑循环中添加一个检查:

for(var i = 0; i < parentNames.length; i++) {
          if (parentIds[i] && parentIds[i] !== "0") {
            content = content.replace(
              new RegExp('(_' + parentNames[i] + ')_.+?_', 'g'),
              '$1_' + parentIds[i] + '_');
           ...

最新更新