我有一个Ruby on Rails应用程序,该应用程序在部分中具有Twitter Bootstrap选项卡,并且用户可以使用Simple Form和Cocoon添加该部分的多个实例。

为了使标签页链接正常工作,我必须为该部分的每个新子级中的标签页使用唯一的名称(这样,单击特定的标签页会激活其自己的唯一内容,而不是名称相同的标签页的内容。前一个子部分出现在同一页面上)。

我看到在Cocoon中添加了代码以实现此目标:https://github.com/nathanvda/cocoon/pull/100

在该讨论中,有迹象表明,该新功能已在Cocoon Simple Form Demo项目中试用。但是,在试用新功能的过程中所做的任何更改均未提交(至少据我所知)。

查看github上的提交,似乎已经在Cocoon javascript代码中完成了添加,方法是在'insertionNode.trigger'调用(https://github.com/woto/cocoon/commit/cb206d501e4749a05e0c1d868911da159c8200c1)的参数上添加'[contentNode]':

insertionNode.trigger('cocoon:before-insert', [contentNode]);


我对这些东西不是很老练。

那么,如何为嵌套孩子的每个新实例实现/获取唯一标识符?

任何帮助或指示将不胜感激。

这是我的应用程序中的代码供参考:

-#/app/controllers/parent_records_controller.rb

class ParentRecordsController < ApplicationController

  # GET /parent_records/1/edit
  def edit
    @parent_record = ParentRecord.find(params[:id])
    @parent_record.items.build
  end
end


-#/ app / views / parent_records / _form.html.haml

.row-fluid
  =simple_form_for(@parent_record, :wrapper => :inline4, :html => {:class => 'form-inline', :multipart => true}) do |f|
    .row-fluid
      = f.simple_fields_for :items do |item|
        =render :partial => '/parent_records/form_partials/item', :locals => { :f => item }
      .row
        .span2.offset9
          = link_to_add_association 'Add Another Item', f, :items, :class => 'btn btn-primary', :partial =>     'parent_records/form_partials/item'
    = f.button :submit , :class => 'btn btn-success'


-#/ app / views / parent_records / form_partials / _item ------ TAB HREF名称是我需要唯一标识符的位置------

.nested-fields
  .well.span
    .tabbable
      %ul.nav.nav-tabs
        %li.active
          %a{"data-toggle" => "tab", :href => "#tab1"} Item Info
        %li
          %a{"data-toggle" => "tab", :href => "#tab2"} Pictures

      .tab-content
        #tab1.tab-pane.active
          = f.input :short_name,:label => 'Item Title'
          = f.input :brand,:label => 'Brand'
          = f.input :description,:label => 'Description'

        #tab2.tab-pane
          = f.simple_fields_for :pictures do |picture|
            =render :partial => '/parent_record/form_partials/picture', :locals => { :f => picture }
          .span2.offset9
            = link_to_add_association 'Add A Picture', f, :pictures, :class => 'btn btn-primary', :partial =>     'parent_records/form_partials/picture'
      .span2
        = link_to_remove_association "Remove Item", f, :class => 'btn btn-danger'


-#/ app / views / parent_records / form_partials / _picture

.nested-fields
  .well.span
    = f.input :image,   :label => 'Seclect Image to be Uploaded'
    = f.input :rank,    :label => 'Image Rank for this Item'
    .row
      .span2
        = link_to_remove_association "Remove Picture", f, :class => 'btn btn-danger'


编辑/后续问题:

内森(Nathan)在下面的回答中尝试添加唯一标识符,但是添加唯一标识符破坏了Bootstrap的制表功能。考虑到我的印象,Bootstrap javascript可能仅在文档最初加载时才评估选项卡和链接之间的对应关系,这似乎有些道理。

谁能指出我的方向来使Bootstrap javascript重新初始化并找到新的ID和链接?

编辑2

事实证明(我认为)是div .well.span分隔.nested-fields.tabbable阻止了Bootstrap能够初始化新命名的href和选项卡ID。疯狂的旅程,但最终还是令人满意的。

最佳答案

首先,在cocoon_simple_form_demo项目中,您将看到使用cocoon:before-insertcocoon:after-insert事件的最后一次提交添加了动画。

after_insert事件为您提供了插入的DOM元素,因此您可以使用它进行任何操作,例如填写唯一的href。

因此,在您的情况下,将类似于以下内容(请注意:完全未经测试的代码,但我希望它能助您一臂之力):

$('form').bind('cocoon:before-insert', function(e,item_to_be_added) {
    new_id = new Date().getTime();
    item_to_be_added.find('a[href="#tab1"]').attr('href', "#tab1_" + new_id);
    item_to_be_added.find('#tab1').attr('id', "tab1_" + new_id);
    // do the same for #tab2
});


这只是标准的jQuery DOM操作。希望这可以帮助。

您可以在插入后重新触发制表符的行为(这需要在插入后进行,否则就没有用了):

   $('form').bind('cocoon:after-insert', function(e,item_to_be_added) {
       $('nav-tabs a').click(function(e) {
         e.preventDefault();
         $(this).tab('show');
       });
   });


您已经应该有这样的代码了吗?另一种选择是使用更好的on,如下所示:

$('form').on 'click', '.nav-tabs a', function(e) {
    e.preventDefault();
    $(this).tab('show');
});


加载页面时,该操作仅应执行一次,并且在添加标签后,此功能将继续起作用。

HTH。

08-25 19:10