2013-08-21 56 views
0

我正在嘗試使用ActiveRecord示波器創建一個記錄過濾系統,但我被卡在了有相同模型的兩個過濾器的地方。我試圖篩選產品brand_id: 1brand_id:2在軌道中使用示波器進行過濾

Product模型中定義的brand範圍如下:

class Product < ActiveRecord::Base 
    belongs_to :brand 

    scope :brand, lambda{|brand| where('brand_id = ?', brand)} 
end 

我想過濾的產品對我categories/show視圖和CategoriesController看起來像這樣:

class CategoriesController < ApplicationController 
    has_scope :brand 

    def show 
    @category = Category.find(params[:id]) 
    @products_by_category = apply_scopes(Product).where(category_id: @category).load 
    @brands = @category.brands 
    end 
end 

categories/show看法是這樣的:

<% @products_by_category.each do |product| %> 
    <h2><%= product.name %></h2> 
<% end %> 

我使用這種形式做過濾:

<%= form_tag @category_path, method: get do %> 
    <% @brands.each do |brand| %> 
    <span class="filter_name"><%= brand.name%>:</span> 
    <span> <%= check_box_tag :brand, brand.id, false, 
            class: 'filter_check_box' %> </span> 

    <% end %> 
    <%=submit_tag 'filter'%> 
<% end %> 

問題是,當我選擇在check_boxes不止一個品牌,它過濾僅在第一個參數的產品;

例如,如果我過濾與品牌與:id 1:id 2並提交表單,它 請求URL是這樣的:http://localhost:3000/categories/1?&brand=1&brand=4 和查詢的陣列僅與brand=1過濾。我希望結果由兩個參數過濾。生成的網址更正確或應該是: http://localhost:3000/categories/1?&brand=1,4

回答

0

您提交的所有過濾器輸入都具有相同的參數密鑰brand。所以,參數散列只能有一個值用於該鍵。

你想用一個check_box_tag而不是爲'brand_ids[]'

<%= check_box_tag 'brand_ids[]', brand.id, false, class: 'filter_check_box' %> 

最後,並且,你無法通過GET動作發送一個數組的參數,這是重要的。您將需要使用POST。正如下面的第二個鏈接所指出的,這是HTTP的限制,而不是Rails。

參見:

除了

我會虛心建議您參考變量更一致的名稱,以方便閱讀和維護的代碼。如果您使用的是品牌標識,那麼請將其稱爲品牌標識,而不是品牌。

+0

它仍然無法正常工作,它將'brand_ids []'作爲單個參數傳遞,而不是brand_ids數組。該參數是否與該範圍的名稱匹配? –

+1

在仔細檢查了您的表單設置和您遇到的問題後,我在發送參數的GET限制中添加了一條評論。 –

+0

你的第二個鏈接告訴我我需要知道什麼,因此我會接受你的答案。 –