我正在尝试创建一个三输入选择菜单,允许用户过滤到数据库中的一个课程进行选择。因此,用户首先选择该位置,并且基于该选择给出该位置中的所有课程选项。然后他可以按选择并进入该课程。动态部分让我的思绪有点弯曲。如果可能的话,我会爱任何帮助。我理解可能需要一些AJAX,但我在这方面迷失了。请任何建议。
到目前为止代码。视图。
<div class="row no-gutters wow slideInUp" data-wow-duration="1s">
<div class="col-md-12 home-form">
<form class="form-inline">
<select class="custom-select mb-0 mr-sm-0 mb-sm-0">
<option selected>Location</option>
<%= @locations.each do |location| %>
<option value="<%= location.id %>"><%= location.header %></option>
<% end %>
</select>
<select class="custom-select mb-0 mr-sm-0 mb-sm-0">
<option selected>Course Type</option>
<%= @courses.each do |course| %>
<option value="<%= course.id %>"><%= course.course_type %></option>
<% end %>
</select>
<select class="custom-select mb-0 mr-sm-0 mb-sm-0">
<option selected>Course</option>
<%= @courses.each do |course| %>
<option value="<%= course.id %>"><%= course.title %></option>
<% end %>
</select>
<button type="submit" class="btn btn-primary">Submit</button>
</form>
</div>
</div>
控制器只需为所有位置和课程提取变量。
然后模型具有如下关联。
当然
belongs_to :location
位置
has_many :courses, dependent: :destroy
我可以看到下拉列表中的所有课程和位置,但我需要能够选择一个位置,然后才能看到该位置的课程。如果有任何AJAX代码被响应,我会喜欢解释代码中的内容,如果你有时间的话。太感谢了。
答案 0 :(得分:3)
您可以按照我的说明将动态相关下拉列表添加到rails应用程序 -
步骤-1。添加操作以路由文件以获取特定位置的所有课程。
# config/routes.rb
Rails.application.routes.draw do
get 'get_courses_by_location/:location_id', to: 'courses#get_courses_by_location'
get '/course_search' => 'courses#course_search'
end
步骤-2。使用get_courses_by_location操作
创建课程控制器# app/controllers/courses_controller.rb
class CoursesController < ApplicationController
def get_courses_by_location
@courses = Course.where("location_id = ?", params[:location_id])
respond_to do |format|
format.json { render :json => @courses }
end
end
def course_search
if params[:location].present? && params[:location].strip != ""
@courses = Course.where("location_id = ?", params[:location])
else
@courses = Course.all
end
end
end
步骤-3。创建一个js文件,用于填充课程下拉列表,并更改位置下拉列表。
# app/assets/javascripts/courses.js
$(function() {
if ($("select#location").val() == "") {
$("select#course option").remove();
var row = "<option value=\"" + "" + "\">" + "Course" + "</option>";
$(row).appendTo("select#course");
}
$("select#location").change(function() {
var id_value_string = $(this).val();
if (id_value_string == "") {
$("select#course option").remove();
var row = "<option value=\"" + "" + "\">" + "Course" + "</option>";
$(row).appendTo("select#course");
} else {
// Send the request and update course dropdown
$.ajax({
dataType: "json",
cache: false,
url: '/get_courses_by_location/' + id_value_string,
timeout: 5000,
error: function(XMLHttpRequest, errorTextStatus, error) {
alert("Failed to submit : " + errorTextStatus + " ;" + error);
},
success: function(data) {
// Clear all options from course select
$("select#course option").remove();
//put in a empty default line
var row = "<option value=\"" + "" + "\">" + "Course" + "</option>";
$(row).appendTo("select#course");
// Fill course select
$.each(data, function(i, j) {
row = "<option value=\"" + j.id + "\">" + j.title + "</option>";
$(row).appendTo("select#course");
});
}
});
}
});
});
步骤 - 4.现在将js课程添加到app.js文件下面的jquery文件。
# app/assets/javascripts/application.js
//= require jquery
//= require jquery_ujs
//= require courses
//= require_tree .
步骤 - 5.此处为课程搜索表单
# app/views/courses/course_search.html.erb
<div class="row no-gutters wow slideInUp" data-wow-duration="1s">
<div class="col-md-12 home-form">
<%= form_tag(course_search_path, method: "get", class: "form-inline", remote: true) do %>
<%= select_tag "location", options_from_collection_for_select(Location.all, "id", "header"), prompt: "Location", class: "custom-select mb-0 mr-sm-0 mb-sm-0" %>
<%= select_tag "course_type", options_from_collection_for_select(Course.all, "id", "course_type"), prompt: "Course Type", class: "custom-select mb-0 mr-sm-0 mb-sm-0" %>
<%= select_tag "course", options_from_collection_for_select(Course.all, "id", "title"), prompt: "Course", class: "custom-select mb-0 mr-sm-0 mb-sm-0" %>
<%= submit_tag("Search", class: "btn btn-primary") %>
<% end %>
</div>
</div>
<div class="row" id="course_listing">
<%= render partial: "course_list", locals: {courses: @courses} %>
</div>
步骤 - 6.现在你必须创建一个course_list部分文件来显示所有课程
# app/views/courses/_course_list.html.erb
<% courses.each do |course| %>
<%= course.id %>
<%= course.title %>
<hr />
<% end %>
步骤 - 7.为ajax搜索表单提交的显示课程创建一个js视图文件。
# app/views/courses/course_search.js.erb
$('#course_listing').html('<%= j render partial: "course_list", locals: {courses: @courses} %>')
我希望它能起作用。