Pierwsza aplikacja

Witam,
Staram się przerabiac Pragmatic Bookshelf Agile Web Development with Rails i budując aplikacje krok po kroku pojawiają się w mojej głowie pytania które chciałbym zadać szanownym forumowiczom. Aplikacja prezentowana w tej książce to jak wiadomo sklep internetowy jako że sama w sobie jest bardzo prosta postanowiłem ją troszkę rozbudować. Propozycja autorów to stworzenie kontrolera store który jest można powiedziec kręgosłupem aplikacji. I teraz powiedzmy jesli chciałbym stworzyć metode która przybliżała by mi bardziej każdą pozycję musze stworzyć nową metodę powiedzmy show_item w kontrolerze store czy może show w kontrolerze klasy product? Powiedzmy że naklepałem kawałek kodu jeśli chodzi o to czy działa to działa i wszystko wykonuje poprawie ale chodzi o semantyke. Czy takie coś przechodzi w rails czy musze jeszcze wiele wiele doczytać?

    def show_product
            @tree = Category.find(:all, :include => [ :children ])
            @product = Product.find(params[:id])
            @manufacturer = Manufacturer.find(@product.manufacturer_id)
    end

Pozdrawiam

Może by zdefiniować zapytania w modelach jako funkcje i ich użyć w kontrolerze?

  1. Tree sobie już zbudujesz po stronie widoku. Jeśli model Category ma mixin acts_as_tree, to możesz się spokojnie w widoku przy iteracjach odwoływać do metod typu children.
    Nie rób include’a w find, bo wyciągasz i tak wszystkie kategorie.
  2. Jeśli Product belongs_to :manufacturer, to wystarczy w widoku:
    @product.manufacturer <- zwraca obiekt klasy Manufacturer

(btw, Producer jest nazwą trochę bardziej intuicyjną, krótszą i logiczną :wink: )

Nie wiem, Expilo, jakie Ty chcesz zapytania w modelach definiować? Skoro ActiveRecord daje już wszystko, czego kolega na tym etapie potrzebuje?

BTW, Sh - mam nadzieję, że “Agile…” 2. edycja? Bo pierwsza nadaje się na przemiał i nie wolno się z niej uczyć.

Tomash: Tak uczę się z drugiej edycji. To jak najsensowniej zrobić bym mógł generowac sobie w jakiś sposób całe drzewo kategorii i na stałe wpiąc to to szablonu strony bo to ze będą kategorie się nie zmienia. Aktualnie robię tak że do kazdego budowanego widoku dodaje linie <%= display_tree_recursive(@tree, 0) %> by takie drzewo zostało wyświetlone to jest droga na około ale nie mam innego pomysłu jak to zrobić.

Pozdrawiam

Wystarczy że złapiesz kategorie główne (parent_id=0 albo parent_id=null, nie wiem jak sobie wymyśliłeś w bazie tę funkcjonalność), a w widoku skorzystasz z .children.

I do wyświetlania owszem, musisz napisać własnego helpera.

Rodzą się kolejne pytania, czy takie coś ma sens i czy jest zrobione poprawnie:
Tworrze w modelach metody:
def self.a
return Description.find(:all).size
end
def self.a
return Nick.find(:all).size
end

Potem wywołuje te metody bezpośrednio w widoku poprzez Nick.a i Description.a by otrzymać liczbe Nicków w bazie i ich opisów czy to jest ok czy zrobiłem coś na około?

Pozdrawiam

Właściwie to możesz i tak, ale czy nie prościej tak? :
class Description < Activeblablabla
def self.a
find(:all).size
end
end

Praca domowa: książka lub inna dobra dokumentacja Ruby’ego, rozdział o klasach i obiektach :slight_smile:

Mozna po prostu Description.count (opcjonalnie z argumentami - podobnie jak find) :slight_smile:

Tomash: Ale czy jest to poprawne z punktu widzenia pisania aplikacji? Czy takie rzeczy się robi czy raczej omija?

Pozdrawiam

Paweł: masz rację, nie wiem czemu od razu tego nie podałem. Zmyliło mnie to “i opisów”, więc nie refaktorowałem rozwiązania zbyt głęboko :wink:

Sh: Rozwiązanie Pawła jest jak najbardziej poprawne i Rails-way.