2017-01-06 5 views
3

Есть ли способ фильтровать раскрывающийся список на основе другого значения выпадающего списка?
Например, если у нас есть: Class и Student Модели, в которых Student есть class_id; есть ли способ отфильтровать учащихся, показанных в раскрывающемся списке, на основе выбранного Class?Разбиение Rails_Admin

EDIT

Видимо, rails_admin камень имеет association отношения, которые я искал; но это не работает отлично.

ответ

2

Если вы можете использовать Javascript, это Railscast поможет вам:

В этом случае, ваши выпадающие может выглядеть следующим образом:

<%= f.collection_select :class_id, Class.all, :id, :name, {:prompt => "Select a Class"}, {:id => "class"} %> 

<%= f.collection_select :student_id, Student.all, :id, :name, {:prompt => "Select a Student"}, {:id => "student"} %> 

И вы должны использовать JavaScript, чтобы изменить параметры в Студента падать. Вы можете получить значение класса с помощью:

class_id = $("#class").find(":selected").text() 
+0

я вверх проголосовал ваш ответ, основанный на его содержании, но это не то, что я ищу .. Я использую Rails_Admin драгоценный камень, который автоматически генерирует ваш сервер .. –

+0

Можете ли вы изменить внешний интерфейс и javascript? Не могли бы вы использовать что-то вроде select2 js plugin? – mlabarca

+0

@mlabarca, к сожалению, нет –

2

Учитывая два <select> элементов "Class" и "Student" с Student списка, содержащего data-class_id атрибутов, ссылающихся значение из Class списка (см фрагмента ниже), вы можете фильтровать "Student" выпадающее меню на основе стоимости "Class" DropDown, используя следующий код ваниль JavaScript:

var firstSelectId = "Class"; 
 
var secondSelectId = "Student"; 
 
var data_attr = "class_id"; 
 
this.addEventListener("DOMContentLoaded", function(event) { 
 
    var firstSelect = document.getElementById(firstSelectId); 
 
    var secondSelect = document.getElementById(secondSelectId); 
 
    firstSelect.addEventListener("change", function(event) { 
 
    var value = event.target.value; 
 
    Array.prototype.forEach.call(secondSelect.options, function(item) { 
 
     item.style.display = (item.dataset[data_attr] === value) ? 'inline' : 'none'; 
 
    }); 
 
    var selected = secondSelect.selectedOptions[0]; 
 
    if (selected && selected.dataset[data_attr] !== event.target.value) { 
 
     secondSelect.selectedIndex = -1; 
 
    } 
 
    }); 
 
    firstSelect.dispatchEvent(new Event('change')); 
 
});
<form id="myform"> 
 
    Select a class and student: 
 
    <select id="Class"> 
 
    <option value="1">Class1</option> 
 
    <option value="2">Class2</option> 
 
    <option value="3">Class3</option> 
 
    </select> 
 
    <select id="Student"> 
 
    <option value="StudentA" data-class_id="1">A</option> 
 
    <option value="StudentB" data-class_id="2">B</option> 
 
    <option value="StudentC" data-class_id="3">C</option> 
 
    <option value="StudentD" data-class_id="2">D</option> 
 
    <option value="StudentE" data-class_id="1">E</option> 
 
    <option value="StudentF" data-class_id="1">F</option> 
 
    </select> 
 
</form>

+0

Я поддержал правильную логику, но это не то, что я ищу –

+0

@RocKhalil в этом случае, не могли бы вы уточнить, что вы ищете, и обновить свой вопрос до включить дополнительные данные? – wjordan

+0

вам необходимо проверить rails_admin gem, чтобы узнать больше о моем вопросе; в любом случае я отредактировал вопрос; Я нашел, как они используют ассоциации; но я сохраняю ответы здесь, потому что они полезны для любого, кто ищет соответствующий вопрос о Dropdows. –

Смежные вопросы