【问题标题】:Filter products by categories using Rails & AJAX使用 Rails 和 AJAX 按类别过滤产品
【发布时间】:2016-04-19 12:54:39
【问题描述】:


我需要创建一个页面,该页面将按所选过滤器显示产品。为简单起见,我将使用产品类别作为过滤器。

页面应该有2个区域:

  1. 产品的展示位置。
  2. 显示类别的位置和“全部清除”按钮。

场景:

用户访问索引页面,显示所有产品。 用户单击“首页类别”并获取属于该类别的所有产品。然后他点击“鞋类”,现在他看到了属于这两个类别(“家居类”或“鞋类”)的所有产品。用户单击“全部清除”按钮(以重置所选类别),现在显示所有类别的所有产品。

我的代码:

我的模型 Product、Category 和连接表 Cause_products。

类别

class Category < ActiveRecord::Base has_and_belongs_to_many :products end

产品

class Product < ActiveRecord::Base has_and_belongs_to_many :categories end

产品控制器:

class ProductsController < ApplicationController
  def index
    @products = Product.all
    @categories = Category.all
  end
  def from_category
    @products = Product.joins(:categories).where(categories: { id: params[:cat_id] })
    respond_to do |format|
      format.js
    end
  end
end


产品/index.html.erb:

<div class="grid">
  <%= render 'sidebar_menu' %>
  <%= render partial: 'product_grid', locals: { products: @products} %>
</div>


产品/_sidebar_menu.html.erb:

<% @categories.each do | cat | %>
<%= link_to cat.name, fetch_products_path(:cat_id => cat.id), :remote => true %>
<% end %>


routes.rb

get "/fetch_products" => 'products#from_category', as: 'fetch_products'


products/_products_grid.html.erb:

<div id="products_grid">
  <%= render partial: 'products_list', locals: { products: products } %>
</div>


products/_products_list.html.erb:

<% products.each do |product| %>
    <div class="product_box">
      product.name
    </div>
<% end %>


products/from_category.js.erb:

$("#products_grid").html("<%= escape_javascript(render partial: 'products_list', locals: { products: @selected } ) %>");


该代码仅适用于一个选定的类别,但我希望它也能够过滤两个或多个类别。我需要进行哪些更改?

谢谢。


谢谢@max@Jeffrey M Castro 帮助我处理我的previous question

感谢 sebastialonso 的文章“How to partials & AJAX, dead easy”。

【问题讨论】:

    标签: ruby-on-rails ajax


    【解决方案1】:

    对于您的 ajax 方法,您可以使用以下方法:

    def from_category
      category_ids = params[:cat_ids]
      @products = Product.joins(:categories).where("categories.id IN (?)", category_ids)
      respond_to do |format|
        format.js
      end
    end
    

    要从您的表单中获取params[:cat_ids],请参阅: Best way to get all selected checkboxes VALUES in jquery 或者 https://api.jquery.com/checked-selector/

    【讨论】:

    • 你能说得更具体些吗?我试图实施您的建议,问题是当我第二次单击类别(选择第二个过滤器)时,它会重置我之前的选择。谢谢。
    • 使用 rails 调试器或 binding.pry,检查每次单击复选框时发送到控制器的参数。 (例如,您按下了 2 个复选框,您应该有 params[:cat_ids] = ["1","2"], 1 和 2 是复选框中类别的 ID 或值。从那里您可以过滤产品.
    • params 发生的情况是:第一次点击后[:cat_ids] = ["1"] 第二次点击后[:cat_ids] = ["2"]。我应该怎么做才能保持点击之间的价值而不是每次都新分配?
    • 这意味着您用于“获取”所有复选框的 javascript 不正确。如果你只检查了 1,那么有 ["1"] 或 ["2"] 是正确的,但是如果你同时检查了,它应该是 ["1", "2"]。请参阅我的答案中的上述链接,该链接会选中所有复选框。
    • 哦,我不应该使用复选框吗?
    猜你喜欢
    • 1970-01-01
    • 2020-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多