Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在“选择标签”上加载数据选择_Javascript_Ruby On Rails 4_Collection Select - Fatal编程技术网

Javascript 在“选择标签”上加载数据选择

Javascript 在“选择标签”上加载数据选择,javascript,ruby-on-rails-4,collection-select,Javascript,Ruby On Rails 4,Collection Select,我有标准的电子商务模型:ProductCategory、Product、Order和OrderItem 在OrderItem模型中有product_id列。当用户创建一个订单并添加一个新的订单项目时,我想让他首先在select_标签中选择产品类别,然后在f.collection_select:product_id仅加载该类别中的产品 现在,我的_order_item_fields.html.haml如下所示: .form-group = label_tag 'product_category

我有标准的电子商务模型:ProductCategory、Product、Order和OrderItem

在OrderItem模型中有product_id列。当用户创建一个订单并添加一个新的订单项目时,我想让他首先在select_标签中选择产品类别,然后在f.collection_select:product_id仅加载该类别中的产品

现在,我的_order_item_fields.html.haml如下所示:

.form-group
  = label_tag 'product_category_id', 'Category'
  = select_tag 'product_category_id', options_for_select(ProductCategory.all, 'id', 'name')

.form-group
  = f.label :product_id, 'Product'
  = f.collection_select :product_id, {# now it's empty}, :id, :name, {prompt: 'Choose category first'}
因此,我需要编写一些JS函数来根据所选类别加载数据。我不确定我是否需要在orders_controller中写入def,或者我可以在orders.coffee as中写入def,该功能在select from product_category_id标签上调用

你能告诉我正确的路吗


谢谢你的帮助

我将编写一个控制器方法,根据产品类别返回正确的产品ID和名称,并通过js创建正确的选项。如果你有很多类别,有很多不同的产品ID,因此应该很好地扩展,这是有意义的

控制器 这将返回以下形式的json:

{
  products: [
    [5, 'name of product with id 5'],
    [12, 'name of product with id 12'],
    ...
  ]
}
路由 然后,您必须为此添加路线条目:

# Routes
get '/route/to/product_options/:category_id', to: 'orders#product_options'
我认为你有资源:在你的路线中的某个地方有订单,但为了简单起见,我现在只是创建了这样的路线-你可以为你的路线修改它

咖啡 要获取此json,可以使用jquery:

要不具有静态类别id,只需收听类别选择器的更改事件:

load_new_category = (category_id) ->
  $.get("/route/to/product_options/#{category_id}")

$ -> # wait until page is loaded completely 
  $('[name="product_category_id"]').on 'change', ->
    load_new_category $(@).val()
最后,您必须使用返回的json来构建选项:

set_product_options = (products_json) ->
  options_html = ''

  for product_array in products_json.products
    id = product_array[0]
    name = product_array[1]

    options_html += "<option value='#{id}'>#{name}</option>"

  $('[name="product_id"]').html options_html

load_new_category = (category_id) ->
  # attach it to `set_product_options` with `.done()`
  $.get("/route/to/product_options/#{category_id}").done set_product_options

$ ->
  $('[name="product_category_id"]').on 'change', ->
    load_new_category $(@).val()
如果rails真的生成了这个名称,请仔细检查jquery选择器,以防出现问题,但这应该会给您一个很好的开始,让您可以根据自己的需要来实现和优化它

这是从head打印出来的,希望没有打字错误

load_new_category = (category_id) ->
  $.get("/route/to/product_options/#{category_id}")

$ -> # wait until page is loaded completely 
  $('[name="product_category_id"]').on 'change', ->
    load_new_category $(@).val()
set_product_options = (products_json) ->
  options_html = ''

  for product_array in products_json.products
    id = product_array[0]
    name = product_array[1]

    options_html += "<option value='#{id}'>#{name}</option>"

  $('[name="product_id"]').html options_html

load_new_category = (category_id) ->
  # attach it to `set_product_options` with `.done()`
  $.get("/route/to/product_options/#{category_id}").done set_product_options

$ ->
  $('[name="product_category_id"]').on 'change', ->
    load_new_category $(@).val()