2014-01-05 59 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

相關問題