Checkbox, zaznaczone pola po przesłaniu

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

  1. 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.
  2. nie wiem czemu stosować before_filter, to troche spowolni, aplikacje bo do każdej akcji będzie wywoływał ten filtr.
  3. 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

  1. 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.
  2. nie wiem czemu stosować before_filter, to troche spowolni, aplikacje bo do każdej akcji będzie wywoływał ten filtr.
  3. 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]

  1. 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)

  1. np. tak:
<%= check_box_tag "category", "cake", !@cake.nil? %>

Ten screencast powinien trochę pomóc.

http://railscasts.com/episodes/17-habtm-checkboxes