Итак, зная, что у вас есть 3 модели:
- Модель A
- Модель B
- Модель C
И предположим, что у вас естьсоздано 3 раскрывающихся списка:
<%= select_tag :modelA, options_for_select(@modelA.collect{|p| [p.name, p.id]}, selected: params[:modelA]), prompt: "Select modelA", class: "form-control", id: "modelA-select" %>
<%= select_tag :modelB, options_for_select(@modelB.collect{|p| [p.name, p.id]}, selected: params[:modelB]), prompt: "Select modelB", class: "form-control", id: "modelB-select" %>
<%= select_tag :modelC, options_for_select(@modelC.collect{|p| [p.name, p.id]}, selected: params[:modelC]), prompt: "Select modelC", class: "form-control", id: "modelC-select" %>
ШАГ 1: На контроллере необходимо добавить:
@modelA = ModelA.all
@modelB = []
@modelC = []
ШАГ 2: Клиент отправляет запрос на серверзатем получает ответ, затем создает выпадающий список modelB
и modelC
.
$(document).on("change", "#modelA-select", function(){
var modelA = $(this).val();
$.ajax({
url: _YOUR_URL_,
method: "GET",
dataType: "json",
data: {modelA: modelA},
error: function (xhr, status, error) {
console.error('AJAX Error: ' + status + error);
},
success: function (response) {
console.log(response);
var modelB = response["modelB"];
$("#modelB-select").empty();
$("#modelB-select").append('<option>Select modelB</option>');
for(var i=0; i< modelB.length; i++){
$("#modelB-select").append('<option value="' + modelB[i]["id"] + '">' + modelB[i]["name"] + '</option>');
}
}
});
});
$(document).on("change", "#modelB-select", function(){
var modelB = $(this).val();
$.ajax({
url: _YOUR_URL_,
method: "GET",
dataType: "json",
data: {modelB: modelB},
error: function (xhr, status, error) {
console.error('AJAX Error: ' + status + error);
},
success: function (response) {
console.log(response);
var modelC = response["modelC"];
$("#modelC-select").empty();
$("#modelC-select").append('<option>Select modelC</option>');
for(var i=0; i< modelC.length; i++){
$("#modelC-select").append('<option value="' + modelC[i]["id"] + '">' + modelC[i]["name"] + '</option>');
}
}
});
});
ШАГ 3: Сервер получает запрос, затем вычисляет и отправляет результаты клиентам.
if params[:modelA].present?
@modelB = ModelA.find(params[:modelA]).modelB
end
if request.xhr?
respond_to do |format|
format.json {
render json: {modelB: @modelB}
}
end
end
if params[:modelB].present?
@modelC = ModelB.find(params[:modelB]).modelC
end
if request.xhr?
respond_to do |format|
format.json {
render json: {modelC: @modelC}
}
end
end
Просто заявление об отказе от ответственности приведено здесь, если вам нужна дополнительная информация