【问题标题】:Rails Dynamic / Cascading Select dropdown listRails 动态/级联选择下拉列表
【发布时间】:2018-09-06 12:35:40
【问题描述】:

我是一个相对初学者,一直在努力让它发挥作用。

在我的表单上,一旦选择了位置 (on_change),我想使用 Ajax 填充房间选择。

我大致遵循了这个 - 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>

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

开始 GET "/bookings/update_rooms?location_id=2&_=1536181850165" 127.0.0.1 2018-09-05 22:10:52 +0100

AbstractController::ActionNotFound - 无法执行“显示”操作 为 BookingsController 找到:

开始 GET "/bookings/update_rooms?location_id=1&_=1536181850166" 127.0.0.1 2018-09-05 22:11:20 +0100

AbstractController::ActionNotFound - 无法执行“显示”操作 为 BookingsController 找到:

非常感谢任何帮助。

【问题讨论】:

    标签: ruby-on-rails ajax coffeescript


    【解决方案1】:

    AbstractController::ActionNotFound - 无法执行“显示”操作 为 BookingsController 找到

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

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

    【讨论】:

    • 谢谢,非常有帮助,而且是一个简单的解决方案。我现在收到一个新错误:在 2018 年 9 月 6 日 14:19:04 +0100 由 BookingsController#update_rooms 作为 JS 参数处理 127.0.0.1 开始 GET "/bookings/update_rooms?location_id=3&_=1536239939020":{"location_id "=>"3", "_"=>"1536239939020"} 找不到 BookingsController#update_rooms 的模板,渲染头:no_content 已完成 204 No Content in 132ms (ActiveRecord: 0.0ms)
    • @Simonp27 你的文件名是什么?应该是update_rooms.js.erb
    • 完美。它实际上需要是 upgrade_rooms.js.erb 但你让我朝着正确的方向前进。谢谢。
    • 您好,如果没有要填充的房间,我将如何添加默认值?我想说“对不起,这个位置没有房间”
    猜你喜欢
    • 2016-01-30
    • 1970-01-01
    • 1970-01-01
    • 2018-09-12
    • 1970-01-01
    • 2014-07-31
    • 2023-03-05
    • 2015-02-25
    • 2013-09-14
    相关资源
    最近更新 更多