我需要创建一个页面,通过选择的过滤器显示产品。为简单起见,我将使用产品类别作为过滤器。
页面应该有两个区域:
情境:
用户访问索引页面,显示所有产品。
用户单击“主页类别”并获取属于此类别的所有产品。然后他点击“鞋子类别”,现在他看到属于这两个类别的所有产品(“家庭类别”或“鞋子类别”)。用户点击“全部清除”按钮(为了重置所选类别),现在显示所有类别的所有产品。
我的模型产品,类别和连接表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_grid.html.erb:
<div id="products_grid">
<%= render partial: 'products_list', locals: { products: products } %>
</div>
产品/ _products_list.html.erb:
<% products.each do |product| %>
<div class="product_box">
product.name
</div>
<% end %>
产品/ 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”。
答案 0 :(得分:0)
对于您的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/