Rails和Ajax:通过选择的filter显示产品
我需要使用Ajax按选定的类别显示产品; 如果用户未选择类别,则显示所有产品。 如果用户选择了一个或两个类别,则只应显示属于这些类别的产品。
例:
我的模型产品,类别和连接表cause_products
类别
class Category < ActiveRecord::Base has_and_belongs_to_many :products end
制品
class Product < ActiveRecord::Base has_and_belongs_to_many :categories end
我正在寻找一个教程,我找到了“Rails 4:” 如何分段和AJAX,很容易 “。我遵循了这个教程,但我得到了一个错误。我觉得我错过了一些东西。
您能否就此提出建议或参考有用的资料来源。 谢谢!
产品控制器:
class ProductsController params[:cat_id]) respond_to do |format| format.js end end end
产品/ index.html.erb:
产品/ _sidebar_menu
cat.id), :remote => true %>
的routes.rb
get "/fetch_products" => 'products#from_category', as: 'fetch_products'
产品/ _products_grid.html.erb
产品/ _products_list.html.erb
product.name
产品/ from_category.js.erb
$("#products_grid").html("");
我的终端输出:
Product Load (3.2ms) SELECT `products`.* FROM `products` WHERE `products`.`category_id` = '11' Mysql2::Error: Unknown column 'products.category_id' in 'where clause': SELECT `products`.* FROM `products` WHERE `products`.`category_id` = '11' Rendered products/_products_list.html.erb (8.8ms) Rendered products/from_category.js.erb (12.2ms) Completed 500 Internal Server Error in 23ms (ActiveRecord: 3.5ms) ActionView::Template::Error (Mysql2::Error: Unknown column 'products.category_id' in 'where clause': SELECT `products`.* FROM `products` WHERE `products`.`category_id` = '11'): 1: 2: 3: 4: app/views/products/_products_list.html.erb:1:in `_app_views_products__products_list_html_erb___255698018512654633_70336949043820' app/views/products/from_category.js.erb:1:in `_app_views_products_from_category_js_erb___4172137050793767106_70336965664480' app/controllers/products_controller.rb:24:in `from_category'`
* – 最初的 sidebar_menu文件只包含一行:
cat.id), :remote => true %>
但是我收到了这个错误:
Showing views/products/_sidebar_menu.html.erb where line #1 raised: undefined local variable or method `cat' for #<#:0x007ff1350376a8> Extracted source (around line #1): cat.id), :remote => true %>
更新1
@max的解决方案:
def from_category @products = Product.joins(:categories).where(categories: { id: params[:cat_id] }) respond_to do |format| format.js end
感谢@max的帮助,他的解决方案是更新控制器操作,它解决了错误,但选择类别后产品列表没有刷新。
日志:
Started GET "/fetch_products?cat_id=11" for ::1 at 2016-04-18 13:53:01 +0300 Processing by ProductsController#from_category as JS Parameters: {"cat_id"=>"11"} Product Load (1.9ms) SELECT `products`.* FROM `products` INNER JOIN `categories_products` ON `categories_products`.`product_id` = `products`.`id` INNER JOIN `categories` ON `categories`.`id` = `categories_products`.`category_id` WHERE `categories`.`id` = 11 Rendered products/_products_list.html.erb (6.4ms) Rendered products/from_category.js.erb (11.5ms) Completed 200 OK in 29ms (Views: 24.1ms | ActiveRecord: 1.9ms)
更新2:
@max这就是我点击某个类别时在响应中得到的结果:
$("#products_grid").html(" \n Bed\n \n \n Notebook\n \n \n Desk\n \n \n Mug\n \n" );
@Jeffrey M Castro注意到我错过了div
的products_grid
id:
产品/ _products_grid.html.erb
该代码仅适用于一个选定的类别,但我希望它能够过滤两个或更多类别。 我需要做出哪些改变?
场景:用户点击“家庭类别”,他获得属于此类别的所有产品。 然后他点击“鞋子类别”,现在他看到属于这两个类别的所有产品(“家庭类别”或“鞋子类别”)。 用户点击“全部清除”按钮(为了重置所选类别),现在显示所有类别的所有产品。
谢谢。
由于您在产品和类别之间存在has_and_belongs_to_many
关系,因此您无法通过products.category_id
选择产品,因为两者之间的实际链接存储在categories_products
连接表中。
您需要使用联接并在关联上指定条件:
@products = Product.joins(:categories) .where(categories: { id: params[:cat_id] })
根据@max的响应,最好使用浏览器检查器的网络选项卡检查服务器提供的JS响应。
在你的代码中:
$("#products_grid").html("<%= escape_javascript(render partial: 'products_list', locals: { products: @selected } ) %>");
您想要更改#products_grid
的html内容,但我没有在您的视图文件中看到任何具有该ID的内容。
所以你必须在div中指定它的id是#products_grid
:
产品/ _products_grid.html.erb
<%= render partial: 'products_list', locals: { products: products } %>
Interesting Posts
Rails 3 + Ajax:如何访问我的本地表单构建器实例
哈希标志后获取请求部分
在rails中调用ajax中的update方法后,在索引视图中更新div?
你可以将replace_html与Rails RJS中的visual_effect结合起来吗?
在ajax中呈现的Rails 3表单获取与text_fields值混合的html
如何做一个Ajax GET请求从rails获取数据并将其传递给javascript(谷歌地图)?
AJAX请求从每个页面命中服务器,我找不到原始AJAX调用的来源
重定向发出PATCH请求而不是GET
如何将caches_action配置为适用于多种格式?
rails ajax_pagination无法找到文件’history’