下拉过滤器以按索引页面上的类别对产品进行排序

时间:2016-04-22 03:14:39

标签: ruby-on-rails filter associations

我对rails很新,正在建立一个在线商店。我目前有一个产品型号和一个类别模型与协会:产品属于一个类别和一个类别has_many产品。我希望购物者能够在下拉列表中选择一个类别,索引页面上的产品将只显示该类别中的项目。

我能够使用form_tag显示所有类别的下拉菜单但是当我选择某个类别时,索引页面不会过滤以仅显示该类别。

产品index.html.erb:

<%= form_tag('products', :remote => true) do %>
  <%= select_tag "category", options_from_collection_for_select(Category.all, "id", "name"),  { :include_blank => true , :class => "product_select"} %>
  <%= submit_tag 'Filter' %>
<% end %>

产品控制器:

  def index
    if Product.all.collect == (params[:category])
        @products= Product.send(params[:category])   
    else
        @products = Product.order(:title)   
    end 

      respond_to do |format|
        format.html # index.html.erb
        format.js # index.js.erb
        format.json { render json: @products } 
      end  
  end

的application.js:

$(document).ready ->   $(".product_select").on "change", ->
    $.ajax
      url: "/products"
      type: "GET"
      dataType: "script"
      data:
        dept_type: $(".product_select").val()

预先感谢您提供任何帮助,如果需要更多信息,请与我们联系。

2 个答案:

答案 0 :(得分:0)

我不确定你是否可以从你的观点中调用数据库(我不这么认为)。如果你能做到,你就不应该这样做。

更改Category.all

这里

<%= select_tag "category", options_from_collection_for_select(Category.all, "id", "name"),  { :include_blank => true , :class => "product_select"} %>

到@categories并在控制器中设置它。

的价值是多少?
 $(".product_select").val()

此外,您可能需要产品和类别的多对多关系。如果您希望某个产品分为两个不同的类别,会发生什么?

答案 1 :(得分:0)

您在更改类别下拉列表中的值的ajax请求时走在正确的轨道上。

  1. 在产品索引页面的div上,显示产品的部分会向该div添加ID(例如products_div)。
    示例代码(_products_list.html.erb)

    <div id="products_div">
      <%= @products.each do |product| %>
      # bla bla bla display product attributes
    </div>
    
  2. 然后在您的控制器上索引,您应该更新它以使用来自ajax请求的数据
    示例代码(products_controller)

    if params[:dept_type].present?  
      @products = Product.where(dept_id: params[:dept_type])  
    else  
      @products = Product.all  
    end  
    
  3. 然后在视图文件products.js.erb上,替换products_div的内容 示例代码(index.js.erb)

    $("#products_div").html("<%= escape_javascript(render partial: 'products_list', locals: { products: @products } ) %>");
    
  4. #3中的代码会将products_div的内容替换为您在更改类别下拉列表时过滤的新@products