Witam,
Potrzebuje posortować tabele, według kategorii, problem jest z zaznaczeniem danego checkboxa po przesłaniu, zrobiłem to bardzo nieelegnacko.
[code] def index
if params[:bread] || params[:cake]
@products = Product.find(:all, :conditions => {:category => [params[:bread], params[:cake]]})
@cake = params[:cake] == "cake"
@bread = params[:bread] == "bread"
else
@products = Product.find(:all)
@cake = true
@bread = true
end
end[/code]
Proszę o jakieś sugestie, jak to lepiej zrobić. Czy może są już jakieś gotowe pluginy do takiego sortowania
Jako name checkboxa nie stosuj nazwy kategorii, tykko np. “category_id” a w jego value wpisz ID danej kategorii, to w widoku.
W kontrolerze coś takiego:
before_filter :find_category_if_needed
def index
if @category
@products = @category.products
else
@products = Product.find(:all)
end
end
private
def find_category_if_needed
@category = Category.find!(params[:category_id]) unless params[:category_id].blank?
end
Kilka rzeczy, bo troche nierozumiem
- jeśli wrzuce oba checkboxy pod jedną nazwe, to w kontrolerze pod params[:category_id] nie będe mieć tablicy, tylko jedną wartość. (cake, albo bread) nawet jeśli oba zaznacze.
- nie wiem czemu stosować before_filter, to troche spowolni, aplikacje bo do każdej akcji będzie wywoływał ten filtr.
- Zapomniałem dodać widoku, chciałbym się dowiedzieć, jak zaznaczyć checkboxy, już po posortowaniu w tamtym kodzie robiłem to tak:
[code]def index
if params[:bread] || params[:cake]
@products = Product.find(:all, :conditions => {:category => [params[:bread], params[:cake]]})
@cake = params[:cake] == "cake"
@bread = params[:bread] == "bread"
else
@products = Product.find(:all)
@cake = true
@bread = true
end
end[/code]
WIDOK:
<% form_tag 'products', :method => "get" do %>
<%= label_tag "bread", "Wyroby piekarnicze" %>
<%= check_box_tag "category", "bread", @bread %><br>
<%= label_tag "cake", "Wyroby cukiernicze" %>
<%= check_box_tag "category", "cake", @cake %><br>
<%= submit_tag "Sortuj" %>
<% end %>
check_box_tag trzecia wartość, przyjmuje true lub false, zaznaczone lub nie. Tylko to jest nieelegancko troche.
[quote=badeleux]Kilka rzeczy, bo troche nierozumiem
- jeśli wrzuce oba checkboxy pod jedną nazwe, to w kontrolerze pod params[:category_id] nie będe mieć tablicy, tylko jedną wartość. (cake, albo bread) nawet jeśli oba zaznacze.
- nie wiem czemu stosować before_filter, to troche spowolni, aplikacje bo do każdej akcji będzie wywoływał ten filtr.
- Zapomniałem dodać widoku, chciałbym się dowiedzieć, jak zaznaczyć checkboxy, już po posortowaniu w tamtym kodzie robiłem to tak:
[code]def index
if params[:bread] || params[:cake]
@products = Product.find(:all, :conditions => {:category => [params[:bread], params[:cake]]})
@cake = params[:cake] == "cake"
@bread = params[:bread] == "bread"
else
@products = Product.find(:all)
@cake = true
@bread = true
end
end[/code]
WIDOK:
<% form_tag 'products', :method => "get" do %>
<%= label_tag "bread", "Wyroby piekarnicze" %>
<%= check_box_tag "category", "bread", @bread %><br>
<%= label_tag "cake", "Wyroby cukiernicze" %>
<%= check_box_tag "category", "cake", @cake %><br>
<%= submit_tag "Sortuj" %>
<% end %>
check_box_tag trzecia wartość, przyjmuje true lub false, zaznaczone lub nie. Tylko to jest nieelegancko troche.[/quote]
-
zamiast category wpisz category[]
-
before_filter :find_category_if_needed, :only=> :index
(podejrzewam, że hubertplicki pokładał w Tobie spore nadzieje - że nie tylko przyczytasz nazwe metody, ale może też zasugerujesz się jej nazwą ;P)
- np. tak:
<%= check_box_tag "category", "cake", !@cake.nil? %>