Rails Dynamic / Cascading选择下拉列表

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Rails Dynamic / Cascading选择下拉列表相关的知识,希望对你有一定的参考价值。

我是一个相对初学者,并一直试图让这个工作。

在我的表单上,我想在选择了Location(on_change)后使用Ajax填充Rooms select。

我大致跟着这个 - https://kernelgarden.wordpress.com/2014/02/26/dynamic-select-boxes-in-rails-4/ - 但我不能完全开始工作。

形成

<%= form_for @booking do |form| %>
  <p>
    <%= form.label :booked_date %>
    <%= form.date_select :booked_date, order: [:month, :day, :year], start_year: 2018 %>
  </p>
  <p>
    <%= form.select :location_id, options_for_select(@locations.collect { |location| [location.name.titleize, location.id] }, 1), {}, { id: 'locations_select' } %>
  </p>
  <p>
    <%= form.select :room_id, options_for_select(@rooms.collect { |room| [room.name.titleize, room.id] }, 0), {}, { id: 'rooms_select' } %>
  </p>
  <p>
    <%= form.label :start_time %><br>
    <%= form.time_select :start_time %>
  </p>
  <p>
    <%= form.label :end_time %><br>
    <%= form.time_select :end_time %>
  </p>
  <p>
    <%= form.label :meeting_subject %><br>
    <%= form.text_field :subject %>
  </p>
  <p>
    <%= form.submit "Make this booking" %>
  </p>
<% end %>

bookings_controller

def update_rooms
    @rooms = Room.where("location_id = ?", params[:location_id])
    respond_to do |format|
      format.js
    end
  end

路线

Rails.application.routes.draw do
  root 'users#show'

  resources :users
  resources :bookings

  resources :locations do
    resources :rooms
  end


  resources :rooms do
    resources :bookings
  end

  get 'bookings/update_rooms', as: 'update_rooms'

end

update_rooms.JS

    $("#rooms_select").empty().append("<%= escape_javascript(render(:partial => @rooms)) %>")


bookings.js.coffee

$ ->
  $(document).on 'change', '#locations_select', (evt) ->
    $.ajax 'update_rooms',
      type: 'GET'
      dataType: 'script'
      data: {
        location_id: $("#locations_select option:selected").val()
      }
      error: (jqXHR, textStatus, errorThrown) ->
        console.log("AJAX Error: #{textStatus}")
      success: (data, textStatus, jqXHR) ->
        console.log("Dynamic location select OK!")

部分房间/ _room.html.erb

<option value="<%= room.id %>"><%= room.name %></option>

当我运行页面并更改位置选择时,我收到此错误:

开始获取“/ bookings / update_rooms?location_id = 2&_ = 1536181850165”for 127.0.0.1 at 2018-09-05 22:10:52 +0100

AbstractController :: ActionNotFound - 找不到BookingsController的动作'show':

开始获取“/ bookings / update_rooms?location_id = 1&_ = 1536181850166”for 127.0.0.1 at 2018-09-05 22:11:20 +0100

AbstractController :: ActionNotFound - 找不到BookingsController的动作'show':

任何帮助非常感谢。

答案

AbstractController :: ActionNotFound - 找不到BookingsController的动作'show'

问题是您指定的自定义路线与showbookings路线冲突。您需要将自定义路线放在resources :bookings上方以避免该错误并将该路线映射到update_rooms动作

get 'bookings/update_rooms', as: 'update_rooms'
resources :bookings

以上是关于Rails Dynamic / Cascading选择下拉列表的主要内容,如果未能解决你的问题,请参考以下文章

级联/继承/共享 Rails 配置环境

cascading--wordcount

使用 Cascalog/Cascading 读取 XML

Cascading Style Sheet

关于CSS (Cascading Style Sheets)

ADF Cascading Lov 搜索和选择弹出自定义