我有以下情况:
class Product < ActiveRecord::Base
belongs_to :categories
end
class Category < ActiveRecord::Base
has_many :products
end
例如,类别表有2级嵌套。 主要类别是“男士”,子类别是“配件”,子类别是“手表”。
现在,当用户创建新产品时,他必须选择类别(仅需要主要类别,但他也可以选择子和子子类别可选)。 我的想法如下:我创建了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
因此,对于最终结果,我有以下内容:
首先,在一个表单中使用不同的输入,手动创建不同的输入是正常的,就像我在本例中所做的那样吗?出于某种原因,它似乎对我来说是“代码嗅觉”。我对rails很陌生,所以想问这个代码是否违反了一些好的做法?你能建议更好的方法来获得相同的结果吗?
答案 0 :(得分:0)
我看到的第一个问题是,由于rails只占用最后一个值,如果未选择最后一个选择,则值将为“”(我在这里不是100%肯定,但似乎是合乎逻辑的。)
可能最好的方法是拥有一个隐藏字段存储值并在选择更改时更新(当然有适当的逻辑)?