2013-11-04 9 views
6

Jeśli użytkownik wybierze predefiniowane łącze filtru, w jaki sposób mój indeks wyświetli wyniki na podstawie tego żądania?Wyniki indeksu filtru Railsowego za pomocą łącza (bez rozwijanego menu)

<h1>Products</h1> 
<% @products.each do |product| %> 
<%= link_to product.name, product_path(product) %> 
<% end %> 

<h2>Find Product by Category</h2> 
Electronics 
Apparel 
Books 

Na przykład, w jaki sposób utworzyć łącze „Electronics”, aby filtrować indeks produkty tylko obejmują produkty z kategorii „Elektronika”? Pole/kolumna "kategoria" jest już zdefiniowane w mojej bazie danych/modelu.

Jest to obecnie co mój kontroler wygląda następująco:

def index 
    @products = Product.all 
end 

Dzięki.

Odpowiedz

13

Dodać do linków link do produktów, ale dodaj kategorię jako parametr URL.

Następnie w kontrolerze, jeśli parametr jest obecny, filtruje wyniki na jego podstawie. Takich jak:

Widok:

<h2> Find Product by Category </h2> 
    <%= link_to "Electronics", products_path(:category=>"electronics") 

Controller

def index 
    if params[:category] 
    @products = Product.where(:category => params[:category]) 
    else 
    @products = Product.all 
    end 
end 

podstawie komentarzem egyamado:

Jeśli chcesz dodać wiadomości bezpośrednie byłoby coś takiego:

def index 
    if params[:category] 
    @products = Product.where(:category => params[:category]) 
    flash[:notice] = "There are <b>#{@products.count}</b> in this category".html_safe 
    else 
    @products = Product.all 
    end 
end 

Jeśli chcesz wyświetlić komunikat tylko wtedy, gdy nie ma żadnych produktów, dodaj po prostu if @products.empty? na końcu oznaczenia lampy błyskowej.

Lub możesz uczynić go całkowicie warunkowym, jeśli chcesz wyświetlić komunikat o błędzie, jeśli nie ma żadnych produktów i zawiadomienie, jeśli są produkty

def index 
    if params[:category] 
    @products = Product.where(:category => params[:category]) 
    if @products.empty? 
     flash[:error] = "There are <b>#{@products.count}</b> in this category".html_safe 
    else 
     flash[:notice] = "There are <b>${@products.count}</b> in this category".html_safe 
    end 
    else 
    @products = Product.all 
    end 
end 
+0

Dokładnie to, co próbowałem wymyślić. Dzięki za tonę. –

+1

Stary ... Szukałem tej dokładnej odpowiedzi przez dwa miesiące. Dokładne pytanie, doskonała odpowiedź. Bardzo, bardzo doceniane. Wydaje się to takie proste teraz, gdy na nie patrzę. – etusm

+0

Dzięki @trh, zagłosuj. W Twoim rozwiązaniu, gdy kategoria zostanie wybrana, wszystkie powiązane produkty zostaną wyświetlone. A gdy żadna kategoria nie zostanie wybrana, pokaż wszystkie produkty. Ale jak wybrać kategorię, która nie ma produktów, powiedzmy, że pokazuje wszystkie produkty z wiadomościami flash, powiedz: "Brak produktów dla elektroniki!"? Dzięki! – egyamado

0

Dziękuję bardzo za twój post. To było idealne dla moich potrzeb również

Używam go w linku <td><%= link_to 'Show', candidates_path(:atc_name=>(atc.name)) %></td>.