我对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()
预先感谢您提供任何帮助,如果需要更多信息,请与我们联系。
答案 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请求时走在正确的轨道上。
在产品索引页面的div上,显示产品的部分会向该div添加ID(例如products_div
)。
示例代码(_products_list.html.erb)
<div id="products_div">
<%= @products.each do |product| %>
# bla bla bla display product attributes
</div>
然后在您的控制器上索引,您应该更新它以使用来自ajax请求的数据
示例代码(products_controller)
if params[:dept_type].present?
@products = Product.where(dept_id: params[:dept_type])
else
@products = Product.all
end
然后在视图文件products.js.erb
上,替换products_div
的内容
示例代码(index.js.erb)
$("#products_div").html("<%= escape_javascript(render partial: 'products_list', locals: { products: @products } ) %>");
#3中的代码会将products_div的内容替换为您在更改类别下拉列表时过滤的新@products