【问题标题】:Dynamic select dropdown Rails 5 / AJAX动态选择下拉Rails 5 / AJAX
【发布时间】:2023-03-05 15:43:01
【问题描述】:

我正在尝试制作一个三输入选择菜单,允许用户过滤到数据库中的一门课程以进行选择。因此,用户首先选择位置,并基于该选择给出该位置中课程的所有选项。然后他可以按选择并被带到该课程。动态部分让我有点弯曲。如果可能的话,我很乐意提供帮助。我知道可能需要一些 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 代码得到响应,如果您有时间,我很乐意解释代码中发生的事情。太感谢了。

【问题讨论】:

    标签: ajax ruby-on-rails-5 dynamic-forms


    【解决方案1】:

    您可以按照我的说明将动态相关下拉列表添加到您的 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 添加到 jquery 文件下方的 application.js 文件中。

    # app/assets/javascripts/application.js
    
    //= require jquery
    //= require jquery_ujs
    //= require courses
    //= require_tree .
    

    Step - 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. 创建一个用于显示课程的 js 视图文件,用于 ajax 搜索表单提交。

    # app/views/courses/course_search.js.erb
    $('#course_listing').html('<%= j render partial: "course_list", locals: {courses: @courses} %>')
    

    我希望它应该工作。

    【讨论】:

    • 嗨@sahidur,所以我已经尝试过了,它确实在网址中给出了结果,例如localhost:3000/?location=10&course_type=21&course=22 我正在寻找的结果是当我在第一个搜索表单中选择一个位置时那么课程列将仅显示表格该部分中该位置的课程。然后,当用户点击提交时,他们将被带到他们留下的课程的显示页面。这有意义吗?
    • 嗨@Bradley,我修改了答案。现在,在更改搜索表单位置下拉列表后,触发 ajax 并更改课程下拉列表,然后如果用户点击搜索按钮,则通过在搜索表单上添加 remote:true 来更改课程列表。希望它有效并满足您的要求。编码愉快。
    • 我现在会检查这个 Sahidur。如果它有效,我会欠你一杯。谢谢。
    • Sahidur 上的现货。谢谢一百万!
    • 快速点Sahidur。如果我现在想让搜索栏转到表单中突出显示的课程,如何选择要包含在 link_to 中的 course_id,因为表单代码似乎只是提取了与该位置关联的所有可用课程。有没有办法在表单中获取当前所选课程的 ID?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-12
    • 2019-06-04
    • 1970-01-01
    • 2020-09-25
    • 1970-01-01
    • 1970-01-01
    • 2013-07-09
    相关资源
    最近更新 更多