1

目前我有兩個下拉列表,其中一個表示要提交的角色和其他分配。我的代碼是根據欄中的上述下拉列表的選擇禁用下拉列表

<div class="field"> 
    <% f.label :role %> 
    <%= f.select :role, options_for_select(%w(Investigator Manager Director)) %> 
</div> 
<div class="field"> 
    <h4>Assigning to</h4> 
    <%= f.collection_select(:assigned_to, User.find_all_by_role("Manager"), :id, :email) %> 
</div> 

我希望第二個下拉列表僅在第一個下拉列表中選擇調查員時出現。關於如何實現這一點的任何建議

回答

2

您將要使用jQuery和JavaScript來實現這一點。另一個很好的資源是ryan bates的railscast關於確切的問題。

你基本上想要做的是有一些JavaScript觀察:role下拉框的當前值。通常你會通過.bind (.on)來檢查下拉的變化事件。然後,您要根據該值顯示/隱藏:assigned_to框。由於這看起來是一堆選項,它應該是一個非常簡單的javascript。

jQuery -> 
    ($ 'select#assigned_to').hide() 
    ($ 'select#role').change -> 
    role = ($ 'select#role :selected').text() 
    if role is 'Investigator' 
     ($ 'select#assigned_to').show() 

現在很明顯,這是coffeescript,應該相應地進行轉換,但這應該可以幫助您找出需要完成的工作。

+0

「現在很明顯,這是CoffeeScript的,應進行相應轉換」正如我所說。是的,這是咖啡文字。另外,謝謝你指出這一點,我的壓痕發佈後嚇壞了。現在它是固定的。 – 2012-03-05 19:11:11

+0

感謝您的回覆 – 2012-03-06 19:57:54

1

我最近在類似的情況,雖然我確定你的問題已經被解決了,但我認爲這仍然有助於其他人可能會尋求相同的答案。

$(document).ready(function() { 
    prevOrigin = ""; 
    prevDestination = ""; 
    $('#origin').change(function() { 
     var selected = $(":selected",this).text(); 
     $('#destination option:contains("' + prevOrigin +'")').removeAttr("disabled"); 
     $('#destination option:contains("' + selected +'")').attr("disabled","disabled"); 
     prevOrigin = selected; 
    }); 

    $('#destination').change(function() { 
     var selected = $(":selected",this).text(); 
     $('#origin option:contains("' + prevDestination +'")').removeAttr("disabled"); 
     $('#origin option:contains("' + selected +'")').attr("disabled","disabled"); 
     prevDestination = selected; 
    }); 
});​ 

看到demo