【问题标题】:Rails Nested Form - Items Dynamically Added All Get Zero IndexRails 嵌套表单 - 动态添加的项目全部获取零索引
【发布时间】:2012-03-15 22:32:55
【问题描述】:

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

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

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

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

我很确定我做错了什么,因为我能够做一个简单的新应用程序。但我无法弄清楚我的真实应用有什么问题。

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

我使用 Firebug 单步执行了nested_form.js 中的代码,但无法弄清楚为什么它会在那里生成 0 索引。

我的父模型有这个:

类课程<:base>

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) 这可能破坏了其他东西(可能有多个嵌套级别?)。

【问题讨论】:

    标签: ruby-on-rails nested-forms nested-attributes


    【解决方案1】:

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

    我做的“错误”是我使用字段集来分隔表单的区域。我给字段集提供了“字段”类。不好。与表单生成器的类冲突。

    【讨论】:

    • 哈哈,这听起来很对。但老实说,上次我尝试使用 nested_form gem 时,我觉得它正在尝试做太多事情来努力为每个人提供一切。从那时起,它看起来更加复杂。我最终只是在他的代码的帮助下推出了自己的解决方案,这花了我一整天的时间和理解,但我能够用我的解决方案做任何我想做的事情。如需更多帮助,请查看this blog post
    • 是的,我看到了那个帖子。这是一个相当复杂的主题,所以我对它的效果印象深刻。
    • @KenThompson,如果我没有为嵌套字段指定“字段”类,link_to_remove 不起作用,它不会隐藏嵌套字段。
    【解决方案2】:

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

    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 添加到我的轮播中。

    【讨论】:

      【解决方案3】:

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

      已经花了将近一整天的时间来单步调试 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] + '_');
                 ...
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-26
        • 2014-10-19
        相关资源
        最近更新 更多