Select

Witam.

W widoku wybieram selektem kategorie produktu.
Gdzie powinno być Category.find(:all).collect {|d| [ d.name, d.id ] }
W widoku?
widok:
<%= f.select :categoryl_id, Category.find(:all).collect {|d| [ d.name, d.id ] } %>

Czy w kontrolerze?
@category = Category.find(:all)
widok:
<%= f.select :categoryl_id, @category %>

Oba działają, ale gdzie jest bardziej odpowiednie miejsce?

Pozdrawiam

Ja słyszałem kiedyś o takiej złotej zasadzie, że każde użycie ‘find’ w widoku jest błędem.

Ja bym najprawdopodobniej użył w widoku Category.all.collect {|d| [ d.name, d.id ] }
Primo, czytelniejsze niż Category.find(:all).
Secundo, spełnia wspomnianą złotą zasadę.
Tertio, nie zaśmieca kontrolera.

A jak do Category.all.collect {|d| [ d.name, d.id ] } dodać order.
Wykorzystuje tę konstrukcje kilka razy i zawsze chce aby były nazwy posortowane alfabetycznie.

Pozdrawiam

[quote=l0pez]Witam.

W widoku wybieram selektem kategorie produktu.
Gdzie powinno być Category.find(:all).collect {|d| [ d.name, d.id ] }
W widoku?
widok:
<%= f.select :categoryl_id, Category.find(:all).collect {|d| [ d.name, d.id ] } %>

Czy w kontrolerze?
@category = Category.find(:all)
widok:
<%= f.select :categoryl_id, @category %>

Oba działają, ale gdzie jest bardziej odpowiednie miejsce?

Pozdrawiam[/quote]
Powinieneś zastosować drugie rozwiązanie z pierwszego twojego postu. Jeśli nie chcesz zaśmiecać kontrolera to możesz tą logikę przenieść do lib.

Do lib ze zwykłym selectem?
Albo pisałeś to pod wpływem piwa, albo ja czegoś tutaj nie rozumiem. Dla mnie to bowiem kompletny idiotyzm.

[quote=l0pez]A jak do Category.all.collect {|d| [ d.name, d.id ] } dodać order.
Wykorzystuje tę konstrukcje kilka razy i zawsze chce aby były nazwy posortowane alfabetycznie.[/quote]
W modelu:

named_scope :alphabetically, :order => 'name asc'

W widoku:

Category.alphabetically.collect {|d| [ d.name, d.id ] }

http://github.com/gbdev/acts_as_dropdown/tree/master

class Category < ActiveRecord::Base
acts_as_dropdown
end

:controller
@categories = Category.to_dropdown # dla Category.find(:all)
@categories = Category.find(:all, :order => ‘name DESC’).to_dropdown #jesli chcesz zamienic array na format [wartosc,nazwa]

:view
<%= d.select ‘categories’, @categories %>[/code]
Ogolnie plugin stary jak swiat, na githubie jest juz jego albo mirror albo zgemowana wersje, autor sie juz do niego raczej nie przyznaje… ale plugin dziala w srodowisku produkcyjnym bez problemu. A jesli nie to nie jest na tyle duzy aby poprawki mogly sprawic problem.

z powyzszego przykladu z named_scope powinno tez zadzialac:

@categories = Category.alphabetical.to_dropdown

[quote=sharnik]Do lib ze zwykłym selectem?
Albo pisałeś to pod wpływem piwa, albo ja czegoś tutaj nie rozumiem. Dla mnie to bowiem kompletny idiotyzm.[/quote]
Może popełniłem małą gafę nie pomyślałem że można utworzyć metodę statyczną. Według mnie jednak druga metoda jest lepsza gdyż nie powinno się używać zbyt często odwołań do modelu w widoku. Po za tym sam używam bezpośrednio metod modelu w kontrolerze zaś widoku używam metod modelu gdy jest to konieczne.