2014-01-05 60 views
0

我有以下情形:具有相同名称属性的一种形式的不同选择?

class Product < ActiveRecord::Base 
    belongs_to :categories 
end 

class Category < ActiveRecord::Base 
    has_many :products 
end 

分类表中有2级嵌套,例如。 主要类别为'男士',子类别为'配件',子类别为'手表'。现在 enter image description here

当用户创建新的产品,他必须选择类别(仅主类需要,但他也可以选择分和小分类别可选)。
我的想法如下:我创建了3个不同的选择框,名称为“product [category_id]”,因此只有最后一个选定的值将通过params [:product] [:category_id]发送到服务器 。

<div class="col-md-2 main-category"> 
    <small> Main category? required </small> 
    <%= f.select :category_id, 
      Category.where('category_id IS ?', nil).collect {|c| [c.name, c.id]}, 
      { include_blank: "Select category..." }, 
      id: 'main-category', class: 'form-control' %> 
</div> 
<div class="col-md-2 category-level-1"> 
    <small> What type? optional </small> 
    <%= f.select :category_id, {}, {}, class: 'form-control' %> 
</div> 

<div class="col-md-2 category-level-2"> 
    <small> What type? optional </small> 
    <%= f.select :category_id, {}, {}, class: 'form-control' %> 
</div> 

第二(子类)和第三(子 - 子类别)是初始空({},{}),并通过CSS隐藏(显示:无),将通过AJAX调用来填充。

$('#main-category, .category-level-1 > select').change(function() { 
    var selectBox = this.id; 
    var selectedValue = $(this).val(); 
    var url = '/categories/' + selectedValue + '/subcategories'; 

    $.get(url, function(data) { createSelect(data, selectBox); }); 
}); 

function createSelect(data, selectBox) { 
    var $currentSelect = null; 

    if (selectBox == 'main-category') { 
    $('.category-level-1').show(); 
    $('.category-level-2').hide(); 
    $('.category-level-1 > select').find('option').remove(); 

    $currentSelect = $('.category-level-1 > select'); 
    } 
    else { 
    $('.category-level-2').show(); 
    $('.category-level-2 > select').find('option').remove(); 

    $currentSelect = $('.category-level-2 > select'); 
    } 

    $currentSelect.append('<option selected disabled>Select Category...</option>'); 
    for(var i=0; i<data.length; i++) { 
    $currentSelect.append('<option value="' + data[i].id + '">' + data[i].name + 
          '</option>'); 
    } 
} 

当Ajax调用发送到以下航线(类别控制器)

def subcategories 
    id = params[:id] 
    @subcategories = Category.where('category_id = ?', id) 
    render json: @subcategories 
end 

因此对于最终的结果我有以下: enter image description here

首先是正常的,有不同的以一种手工创建的相同名称的输入,就像我在这个例子中做的那样?由于某种原因,它对我来说看起来像是“代码味道”。我对rails比较陌生,所以想要问am'i违反了这些代码的一些好的做法吗?你能提出更好的方法来达到相同的结果吗?

+0

我不知道Rails,但在浏览器端,如果您有多个具有相同名称的表单元素,它们将以标准格式提交发送到服务器。如果你真的想使用服务器端的所有值,我会说这是“正常的”,但是如果你的Rails代码故意忽略重复,我会说这不是一种“正常”的方式来实现这种效果,但如果它的工作原理...(作为一个非Rails的家伙,我不能建议你的项目更好的选择) – nnnnnn

回答

0

我看到的第一个问题是,因为钢轨只取最后一个值,所以如果最后一个选择没有被选中,值将是“”(我在这里不是100%确定,但似乎是合乎逻辑的)。

可能最好的方法是隐藏字段存储值并在选择更改时更新(当然有适当的逻辑)?

+0

当我从第二和第三选择移出include_blank时,我从上次选择的选择中获得值,这对我的脚本 – Srle

相关问题