基于Select Box – Rails 2.3.5的动态局部化

我编辑了我的请求,希望更清楚。 我需要根据之前的选择框动态渲染部分。

REQUEST属于PRODUCT

PRODUCT属于CATEGORY

CATEGORY有很多产品

PRODUCT有很多要求

用户点击表单:create_request.html.erb

用户选择一个类别,然后填充产品选择列表(如Railscast 88 – 动态选择框)

我现在需要的是根据选择的产品呈现不同的部分forms。 我吮吸jquery。

create_request.html.erb:

  {:controller => :requests, :action => :create_request, :id => params[:id]} do |f| %>  

#### and here is where I need help: #### if request.product_id = 1, render partial _form1 #### if request.product_id = 2, render partial _form2

dynamic_products.js.erb:

 var products = new Array();  products.push(new Array(, '', , )); products.sort()  function categorySelected() { category_id = $('request_category_id').getValue(); options = $('request_product_id').options; options.length = 1; products.each(function(product) { if (product[0] == category_id && product[3] == 1) { options[options.length] = new Option(product[1], product[2]); } }); if (options.length == 1) { $('product_field').hide(); } else { $('product_field').show(); } } document.observe('dom:loaded', function() { categorySelected(); $('request_category_id').observe('change', categorySelected); }); 

在我们开始之前先提醒一下。 我不确定这一点,但我认为request是rails中的保留字。

JS

这只是观察下拉列表并执行ajax调用

 $(document).ready(function() { $('#request_product_id').change(function() { $.ajax({ url: '/products/' + this.value + '/form_partial' }); }); }); 

ROUTES

这里也没什么特别的。 只需设置ajax触发时的路径

 resources :products do get :form_partial, on: :member end 

CONTROLLER

我们只使用从ajax传递的:id来获取产品

 def form_partial @product = Product.find params[:id] end 

JS模板

您需要创建一个form_partial.js.erb ,它将根据产品呈现部分。 下面的代码在product_field div之后附加partial

  # app/views/products/form_partial.js.erb $('#product_partial').remove(); <% if @product.id == 1 %> $('#product_field').after('
<%= escape_javascript render('partial1') %>
'); <% else %> $('#product_field').after('
<%= escape_javascript render('partial2') %>
'); <% end %>

更新:对于rails 2.x

我们只需要更改路由和js模板,以便在rails 2.x上运行

路线2.x

 map.resources :products, member: { form_partial: :get } 

JS TEMPLATE 2.x

如果我没记错的话,该文件应该命名为form_partial.js.rjs 。 这将为您提供一个page变量,您可以使用它来添加js。

  # app/views/products/form_partial.js.rjs page << "$('#product_partial').remove();" page << "<% if @product.id == 1 %>" page << " $('#product_field').after('
<%= escape_javascript render('partial1') %>
');" page << "<% else %>" page << " $('#product_field').after('
<%= escape_javascript render('partial2') %>
');" page << "<% end %>"