我会编写一个控制器方法,根据产品类别返回正确的产品 ID 和名称,并通过 js 创建正确的选项。如果您有很多具有很多不同产品 ID 的类别,那么这很有意义,因此应该可以很好地扩展。
控制器
# OrdersController
def product_options
category_id = params[:category_id]
render json: {
products: ProductCategory.find(category_id).products.pluck(:id, :name)
}
end
这将返回以下形式的 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'
我认为您resources :orders
的路线中有某处,但为简洁起见,我现在只是创建了这样的路线 - 您可以为您的路线修改它!
咖啡
要获取此 json,您可以使用jquery
:
# orders.coffee
category_id = 5
$.get("/route/to/product_options/#{category_id}")
要没有 static category_id
,只需听change
类别选择器的事件:
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()
请仔细检查 jquery 选择器以防出现问题(如果 rails 确实生成了此名称),但这应该会给您一个良好的开端来实现和优化它以满足您的需求。
(从头打出来,所以希望没有错别字。)