【问题标题】:Dynamic Partial Based on Select Box - Rails 2.3.5基于选择框的动态部分 - Rails 2.3.5
【发布时间】:2013-02-07 08:11:52
【问题描述】:

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

REQUEST 属于 PRODUCT

产品属于类别

CATEGORY 有很多产品

产品有很多请求

用户点击表单: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 %>

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);
});

【问题讨论】:

  • 您需要使用Ajax,在产品/服务选择框的'onChange'事件上触发,将选中的值传递给Ajax,然后部分渲染表单。
  • 这正是我需要做的。你能帮我用一个骨架方法让我开始吗?真的很感激
  • 我需要更多关于请求/类别/产品之间关系的信息(谁属于谁);以及可能应该如何更新 select_box(刷新属于所选类别的产品列表?)
  • 请求有很多类别和产品。产品属于类别。类别属于请求。用户选择类别,然后填充产品选择列表(这已经有效)。然后我需要的是根据所选产品显示不同的形式。
  • 我已经编辑了我的原始帖子,希望更清晰。提前致谢。

标签: ruby-on-rails


【解决方案1】:

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

JS

这只是观察下拉菜单并执行 ajax 调用

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

路线

这里也没什么特别的。只需设置一个 ajax 触发时将去的路由

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

控制器

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

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

JS 模板

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

 # 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 %>

更新:适用于 rails 2.x

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

路线 2.x

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

JS 模板 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 %>"

【讨论】:

  • 好的,我试试这个。请注意,这是 Rails 2.3.5,所以我的 routes.rb 使用“map.resources ...”
  • 而且,我需要创建一个新的 JS 文件还是可以将 JS 放在我现有的 dynamic_products.js 文件中?我做了后者,但是当我选择产品时没有任何反应。
  • 我已经更新了我的答案。你能试试吗?另外,rails 2 的默认 js 是原型。你在用原型吗?
  • 我明天要试试这个——谢谢你的帮助。我给了你赏金和对你所有帮助的投票。至少我现在指向了正确的方向。谢谢!
  • 大家好 - 我在哪里放:$(document).ready(function() { $('#request_product_id').change(function() { $.ajax({ url: '/products/' + this.value + '/form_partial' }); }); });
猜你喜欢
  • 2016-07-21
  • 2013-10-09
  • 2016-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-09
  • 1970-01-01
  • 2012-03-13
相关资源
最近更新 更多