从cocoon获取嵌套表单字段ID号

时间:2013-05-01 13:27:31

标签: ruby-on-rails ruby-on-rails-3 file-upload nested-forms cocoon-gem

我想获得以下结果:

<input class="file required" id="page_media_attributes_1367414416272_image" multiple="multiple" name="page[media_attributes][1367414416272][image]" type="file">

我可以添加任何动态标记:

<div class='span3'> 
  <%= f.input :image, as: :file, :input_html => { :multiple => true, :name => 'page[media_attributes][Something dynamic][image]' } %>
  <%= f.input :name %>

  <%= link_to_remove_association "remove image", f %>
</div>

那会插入数字1367414416272而不是[Something dynamic]来获取上面的html?

每次都有不同的数字,我相信它是由Cocoon生成的,因为这些字段是由cocoon动态添加的。

1 个答案:

答案 0 :(得分:2)

是的,这些数字是由Cocoon自动生成的。来自cocoon的“添加新”javascript函数:

new_id = new Date().getTime() + cocoon_element_counter++

我认为您必须使用javascript才能找到所有“cocoon”元素并解析其id属性以获取随机数,然后相应地更改其名称。

吃水:

$(document).ready(function(){
    $('input[id^="page_media_attributes_"][id$="_image"]').each(function(){
        var current = $(this);
        var rx = /page_media_attributes_(.*)_image/;
        num = rx.exec(current.attr('id'))[1];
        current.attr('name','page[media_attributes][' + num + '][image]');
    });
});

当然,这必须在每个新动态生成的元素上执行。

因此,如果你这样做,你必须“功能化”上面的代码并在文档加载后为所需的每个特定选择器调用一次,然后通过cocoon显式地为每个动态添加的元素调用(根据文档,特殊在添加/删除时触发事件。