2012-05-11 150 views
0

我有一个Rails嵌套形式包含动态选择菜单中的子领域的工作: --category(过滤菜单) - 产品动态选择菜单不加场

我可以得到一个字段集工作,但我已经破解了产品菜单(通过使用DOM备份的主要形式的“备份”collection_select),因为我无法使用.html()在动态字段上加载选择数据。我使用修订的Railscast#88作为模板代码。

真正的问题是只有第一个选择菜单组合工作 - 当我在其他字段集中选择类别菜单时,所有菜单都会失败。我尝试添加(this)方法,但可以使其工作。

任何见解非常感谢!

培训相关js.coffee:

products = $('.products-backup').html() 
$('form').on 'change', '.category', (event) -> 
category = $('.category :selected').text() 
escaped_category = category.replace(/([ #;&,.+*~\':"!^$[\]()=>|\/@])/g, '\\$1') 
options = $(products).filter("optgroup[label='#{escaped_category}']").html() 
if options 
    $('.products').html(options) 
else 
    $('.products').empty() 

培训相关的轨道html.erb部分 - 注意,我分配:类名给每个选择菜单:

<fieldset> 
<div class="field"> 
<%= f.collection_select :category_id, Category.all, :id, :name, { prompt: 'Select' }, 
{ :class => "category" } %> 
</div> 
<div class="field"> 
<%= f.grouped_collection_select :product_id, Category.order(:name), :products, 
:name, :id, :name, { prompt: 'Select' }, { :class => "products" } %> 
</div> 
#...more fields 
</fieldset> 

回答

0

@Jeff,你我想是这样这样的:

var $products_backup = $('#products_backup'); 
$('form').on('click', '.category', function() { 
    var $category = $(this); 
    if (!$category.is(":checked")) { 
     return; 
    } 
    var escaped_category = $category.val().replace(/([ #;&,.+*~\':"!^$[\]()=>|\/@])/g, '\\$1'); 
    var $options = $products_backup.find("optgroup[label='" + escaped_category + "']").find("option"); 
    //$('#products').empty().append('<option value="">Select an item</option>').append($options.clone()).val(""); 
    $category.closest('fieldset').find('.products').empty().append('<option value="">Select an item</option>').append($options.clone()).val(""); 
}); 

参见:

正如你将看到我猜到是.category元素可能是单选按钮。如果不是,那么代码将需要或多或少地进行调整。

+0

代码很好用......我需要对与轨道模型相关的无线菜单格式做一些小改动。仍然存在的一个问题是以相同形式的多组无线电/选择。所以,当我改变一个类别时,它会改变所有的产品,因为它们的类名相同 - 关于如何将每个电台与其相应的产品选择相关联的想法? – Jeff

+0

@Jeff,基于每一组相关元素都包含在一个字段集中,然后尝试编辑上面的代码的最后一行 - 以及相应的更新小提琴。 –

+0

完美的解决方案!感谢您的帮助,这为我节省了时间/天! – Jeff