【问题标题】:Rails App - jQuery to display static text upon dynamic selectRails App - jQuery 在动态选择时显示静态文本
【发布时间】:2013-07-23 15:01:42
【问题描述】:

我有一个包含许多类别的请求表单,而类别包含许多产品。我让 jQuery 根据 CATEGORY 选择填充 PRDOUCTS:

requests.js.coffee:

jQuery ->
    $('#request_product_id').parent().hide()
    products = $('#request_product_id').html()
    console.log(products)
    $('#request_category_id').change ->
        category = $('#request_category_id :selected').text()
        options = $(products).filter("optgroup[label='#{category}']").html()
        console.log(options)
        if options
            $('#request_product_id').html(options)
            $('#request_product_id').parent().show()
        else
            $('#request_product_id').empty()
            $('#request_product_id').parent().hide()

现在我希望在选择产品时显示 product.description 的静态文本。

同时,我想根据所选产品显示自定义表单部分显示。例如,如果 product.id = 1,则渲染 _product1.html.erb 或.... 只需根据 product.id 切换 DIV 以显示适当的字段。

这是我的完整 _form.html.erb:

<%= form_for(@request) do |f| %>
  <% if @request.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@request.errors.count, "error") %> prohibited this request from being saved:</h2>

      <ul>
      <% @request.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field">
    <%= f.label :category_id, "Select a Category:" %>
    <%= f.collection_select(:category_id, Category.sorted, :id, :name, :include_blank => true ) %>
  </div>

  <!--  BASED ON CATEGORY SELECTED ABOVE, LOAD CORRESPONDING PRODUCTS BELOW -->

  <div class="field">
    <%= f.label :product_id, "Select a Product/Service:" %>
    <%= f.grouped_collection_select :product_id, Category.sorted, :products, :name, :id, :name, include_blank: true %>
  </div>

  <!-- ALL OF THE ABOVE WORKS FINE... NOW....  -->
  <!--  BASED ON PRODUCT SELECTED ABOVE, LOAD CORRESPONDING PRODUCT DESCRIPTION AND CORRESPONDING FORM -->

  <div class="field">
    ::::  THIS WILL AUTO POPULATE WITH THE ABOVE-SELECTED PRODUCT.DESCRIPTION  ::::
  </div>

  <p></p>

  <div>
    <p>:::: BASED ON PRODUCT.ID, HIDE/SHOW SPECIFIC DIVS HERE. IF PRODUCT.ID IS NOT SPECIAL, DO NOT SHOW ANYTHING HERE</p>
  </div>

  <!--  THEN, NO MATTER WHAT THE PRODUCT.ID IS, THERE WILL BE A REQUESTOR_NOTE FOR FURTHER INFO -->

    <div class="field">
    <%= f.label :requestor_note, "Please give full details below..." %>
    <%= f.text_area :requestor_note, :size => "50x6" %>
  </div>

  <div class="actions">
    <%= f.submit "Submit" %>
  </div>
<% end %>

【问题讨论】:

  • 你有多少动态内容(产品)?将您需要的所有产品/描述/部分放在页面中是否有太多数据?还是需要 AJAX?
  • 对于描述,有超过200个产品,所以我需要动态拉取。对于自定义表单部分加载,这会随着时间的推移而增长,但现在我有 200 个不需要自定义表单的通用产品 + 7 个需要特殊字段的产品...

标签: jquery ruby-on-rails


【解决方案1】:

我认为您需要添加一个 ajax 调用来呈现您的产品表单部分,如下所示应该可以工作(未经测试)。请注意,名称是编造的。使用以下内容,您不必拥有多个 _product_form 部分,这更好,因为您不必为添加到系统中的每个新产品定义新的部分(不知道您为什么决定走这条路线,即添加每个产品的部分)。

$('#request_product_id').on('change', function(evt) {
  selected_product_id = $(this).val();
  $.ajax({
    url: 'my_controller/product_form',  //Note the my_controller and action here, i.e. change accordingly
    type: 'get', 
    data: { 'product_id=' + selected_product_id }
  });
});

config/routes.rb

get 'my_controller/product_form/:product_id', to: 'my_controller#product_form', constraints: { product_form: /\d+/ }

my_controller.rb

def product_form 
    @product = Product.find(params[:product_id])

    respond_to do |format|
        format.js
    end
end

product_form.js.erb

var target = $('#my_target_field'); // See notes below
target.html("<%= j render('_product_form') %>");

您需要添加一些唯一标识目标div 的内容,以便jQuery 选择器可以轻松工作。您可以添加 id 属性,例如(在您的 _form.html.erb 中):

<div id="my_target_field" class="field">
  ::::  THIS WILL AUTO POPULATE WITH THE ABOVE-SELECTED PRODUCT DESCRIPTION  ::::
</div>

_product_form.html.erb

<div class="my_static_text_field"><%=@product.product_description %></div>
...

【讨论】:

  • 这是一个两部分的问题。所有 product.descriptions 应根据产品选择显示。只有某些产品会有自定义部分。例如,Product=Move Employee,我需要捕获一堆字段,如 from_facility、to_facility、from_room、to_room。鉴于 Product=New Employee,我需要获取姓名、职务、主管等。如果有更好的方法来显示仅在选择某个产品时才使用的大量字段,我完全赞成。跨度>
  • 其他通用产品不会有特殊部分,只有分类选择、产品选择、静态product.description加载,后面是更多详情文本区。
  • 如果我构建一个 _form.html.erb 来保存所有 REQUEST 字段,我将如何根据上面选择的产品切换(隐藏/显示)特定的 DIV?我将显示所有产品的 product.description,然后在其下方切换某些 DIV 以显示相关字段...这是更好的方法吗?
  • @KatieM,您可以使用产品 ID 添加另一个 div,并使用 jQuery 使用该产品 ID 选择器显示/隐藏。请发布一些您拥有的代码以及您期望它做什么,这样我们可以更好地理解问题。
  • 哈 - 这就是问题所在,我还没有任何代码,因为我是 jquery 的新手。我发布了带有 DIV 的完整表格,表明了我希望实现的目标。我会自己再尝试一次,并尝试用更具体的东西回来。谢谢!
猜你喜欢
  • 2019-02-14
  • 1970-01-01
  • 2014-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-14
  • 2016-12-01
相关资源
最近更新 更多