具有相同名称属性的一种形式的不同选择?

时间:2014-01-05 03:31:49

标签: jquery ruby-on-rails ajax ruby-on-rails-3 ruby-on-rails-4

我有以下情况:

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]”的选择框,因此只有最后选择的值将被发送到服务器 通过参数[: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很陌生,所以想问这个代码是否违反了一些好的做法?你能建议更好的方法来获得相同的结果吗?

1 个答案:

答案 0 :(得分:0)

我看到的第一个问题是,由于rails只占用最后一个值,如果未选择最后一个选择,则值将为“”(我在这里不是100%肯定,但似乎是合乎逻辑的。)

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