我编辑了我的请求,希望更清楚.我需要根据之前的选择框动态渲染部分.
REQUEST属于PRODUCT
PRODUCT属于CATEGORY
CATEGORY有很多产品
PRODUCT有很多要求
用户点击表单:create_request.html.erb
用户选择一个类别,然后填充产品选择列表(如Railscast 88 - 动态选择框)
我现在需要的是根据选择的产品呈现不同的部分形式.我吮吸jquery.
create_request.html.erb:
<%= javascript_include_tag "dynamic_products.js" %>
<% form_for :request, :url => {:controller => :requests, :action => :create_request, :id => params[:id]} do |f| %>
<label>Select Category:</label>
<%= select( "request", "category_id", Category.find( :all).collect { |c| [c.name, c.id] })%></br>
<div id="product_field">
<label>Select Product</label>
<%= select( "request", "product_id", Product.find( :all).collect { |p| [p.name, p.id] })%></br>
</div>
#### and here is where I need help:
#### if request.product_id = 1, render partial _form1
#### if request.product_id = 2, render partial _form2
<button type="submit">Submit</button>
<% end %>
Run Code Online (Sandbox Code Playgroud)
dynamic_products.js.erb:
var products = new Array();
<% for product in @products -%>
products.push(new Array(<%= product.category_id %>, '<%=h product.name %>', <%= product.id %>, <%= product.active %>));
products.sort()
<% end -%>
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);
});
Run Code Online (Sandbox Code Playgroud)
在我们开始之前先提醒一下.我不确定这一点,但我认为request在rails中是一个保留字.
JS
这只是观察下拉列表并执行ajax调用
$(document).ready(function() {
$('#request_product_id').change(function() {
$.ajax({ url: '/products/' + this.value + '/form_partial' });
});
});
Run Code Online (Sandbox Code Playgroud)
ROUTES
这里也没什么特别的.只需设置ajax触发时的路径
resources :products do
get :form_partial, on: :member
end
Run Code Online (Sandbox Code Playgroud)
CONTROLLER
我们只是获取:id从ajax传递的产品
def form_partial
@product = Product.find params[:id]
end
Run Code Online (Sandbox Code Playgroud)
JS模板
你需要根据产品创建一个form_partial.js.erb渲染部分的部分.下面的代码在product_fielddiv 之后附加partial
# app/views/products/form_partial.js.erb
$('#product_partial').remove();
<% if @product.id == 1 %>
$('#product_field').after('<div id="product_partial"><%= escape_javascript render('partial1') %></div>');
<% else %>
$('#product_field').after('<div id="product_partial"><%= escape_javascript render('partial2') %></div>');
<% end %>
Run Code Online (Sandbox Code Playgroud)
更新:对于rails 2.x
我们只需要更改路由和js模板,以便在rails 2.x上运行
路线2.x
map.resources :products, member: { form_partial: :get }
Run Code Online (Sandbox Code Playgroud)
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('<div id="product_partial"><%= escape_javascript render('partial1') %></div>');"
page << "<% else %>"
page << " $('#product_field').after('<div id="product_partial"><%= escape_javascript render('partial2') %></div>');"
page << "<% end %>"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2742 次 |
| 最近记录: |