Ponieważ Rails zapewnia strukturę pod względem MVC, naturalne jest, że użyjesz tylko kontenerów modelu, widoku i kontrolera, które są dla Ciebie dostarczone. Typowym idiomem dla początkujących (a nawet niektórych pośrednich programistów) jest wbicie całej logiki aplikacji do modelu (klasy bazy danych), kontrolera lub widoku.
W pewnym momencie ktoś zwraca uwagę na paradygmat „grubego modelu, chudego kontrolera”, a pośredni programiści pośpiesznie usuwają wszystko ze swoich kontrolerów i wrzucają do modelu, który staje się nowym koszem na logikę aplikacji.
Chude kontrolery to w rzeczywistości dobry pomysł, ale następstwem - umieszczenie wszystkiego w modelu, nie jest tak naprawdę najlepszym planem.
W Ruby masz kilka dobrych opcji na uczynienie rzeczy bardziej modułowymi. Dość popularną odpowiedzią jest użycie modułów (zwykle ukrytych lib
), które przechowują grupy metod, a następnie włączenie modułów do odpowiednich klas. Pomaga to w przypadkach, w których masz kategorie funkcjonalności, które chcesz ponownie wykorzystać w wielu klasach, ale funkcjonalność jest nadal teoretycznie dołączona do klas.
Pamiętaj, że kiedy dołączysz moduł do klasy, metody stają się metodami instancji klasy, więc nadal otrzymujesz klasę zawierającą mnóstwo metod, są one po prostu ładnie zorganizowane w wiele plików.
To rozwiązanie może działać dobrze w niektórych przypadkach - w innych przypadkach warto pomyśleć o użyciu klas w kodzie, które nie są modelami, widokami ani kontrolerami.
Dobrym sposobem na zastanowienie się nad tym jest „zasada pojedynczej odpowiedzialności”, która mówi, że klasa powinna być odpowiedzialna za jedną (lub niewielką liczbę) rzeczy. Twoje modele są odpowiedzialne za utrwalanie danych z aplikacji do bazy danych. Twoje kontrolery są odpowiedzialne za otrzymanie żądania i zwrócenie realnej odpowiedzi.
Jeśli masz koncepcje, które nie pasują do tych skrzynek (trwałość, zarządzanie żądaniami / odpowiedziami), prawdopodobnie zastanawiasz się, w jaki sposób modelowałbyś dany pomysł. Możesz przechowywać klasy nie modelowe w aplikacji / klasach lub w dowolnym innym miejscu i dodać ten katalog do ścieżki ładowania, wykonując:
config.load_paths << File.join(Rails.root, "app", "classes")
Jeśli używasz pasażera lub JRuby, prawdopodobnie chcesz również dodać swoją ścieżkę do chętnych ścieżek ładowania:
config.eager_load_paths << File.join(Rails.root, "app", "classes")
Najważniejsze jest to, że gdy dojdziesz do punktu w Railsach, w którym zadajesz to pytanie, nadszedł czas, aby pogłębić swoje kotlety Ruby i rozpocząć modelowanie klas, które nie są tylko klasami MVC, które Railsy domyślnie ci dają.
Aktualizacja: Ta odpowiedź dotyczy Railsów 2.x i nowszych.