Zanim dostalem ksiazke Agile przelecialem przez tutorial z cookbookiem i go sobie troche rozbudowalem. W stronie z layoutem (ktora jest uzywana przez wszystkie inne w moim mini serwisie) na dole w stopce dodalem liste kategorii produktow kulinarnych.
stosujac taki
<% @categories.each do |category| %>
<%= link_to category.name, :action => "list", :controller => 'recipe', :category => "#{category.name}" %> |
<% end %>
oczywiscie aby to dzialalo trzeba zdefiniowac @categories = Category.find(:all)
Zauwazylem aby to dzialalo na wszystkich stronach to musze @categories = Category.find(:all) dodawac do kazdej definicji w kontrolerach, co przeczy zasadzie DRY. Tak wiec sie zastanawiam czy jak dodam ta linijke tylko do szablonu layoutu i usune z kontrolera to czy to nie bedze znow wbrew jakims zasadom (np. MVC)? Jaki styl programowania mam stosowac?
Dodaj @categories = Category.find :all
do kontrolera z ktorego dziedzicza twoje kontrolery.
Bedzie to pewnie ApplicationController jesli nic nie pozmieniales.
Mozesz tez stworzyc jakis wspolny kontroler w ktorym bedzie logika wspolna
dla jakiejs czesci aplikacji i dziedziczyc z niego.
Umieszczanie @categories = Category.find :all w widoku to nie jest najlepsze rozwiazanie,
bo w razie jakichs klopotow ciezko znalezc gdzie @categories sa zdefioniowane. Szukamy w kontrolerach i nic, dopiero po jakims czasie okazuje sie ze ktos to umiescil w widoku w srodku skryptu
Moglbys dac jakies referencje, slowa kluczowe itp apropo helpera ? Osobiscie zrobil bym to tak jak opisal to hosiawak, ale ciekaw jestem jak to mozna zrealizowac przy pomocy helpera ?
[quote=hosiawak]Dodaj @categories = Category.find :all
do kontrolera z ktorego dziedzicza twoje kontrolery.[/quote]
Tak jest raczej najrozsadniej - zwlaszcza, ze @categories jest uzyta w layoucie calej aplikacji.
Dodalbym tylko jakis fallback w wypadku gdyby sie zdarzyl nil (nil.each i exception murowane )
oraz nazwal pole bardziej szczegolowo np. @all_product_categories na wypadek gdyby jeszcze jakies inne kategorie sie pojawily albo subset Category.
Oczywiscie powyzsze po to aby zaoszczedzic sobie ewentualnych przykrych niespodzianek w przypadku gdyby aplikacja byla rozbudowywana.
Helper jest wmiksowany w kontroler. Ale jako modul (poprawcie mnie jesli sie myle) nie moze miec zmiennych instancji, natomiast metody instancji staja sie metodami instancji klasy, w kt. jest wmiksowany. Wiec chyba nic nie stoi na przeszkodzie (nie sprawdzalem!) zrobic cos takiego np. w application_helper.rb: