Poiché Rails fornisce una struttura in termini di MVC, è naturale finire per utilizzare solo i contenitori di modelli, viste e controller forniti. Il linguaggio tipico per i principianti (e anche per alcuni programmatori intermedi) è stipare tutta la logica nell'app nel modello (classe di database), controller o vista.
A un certo punto, qualcuno sottolinea il paradigma "modello grasso, controllore scarno" e gli sviluppatori intermedi escono in fretta tutto dai loro controller e lo gettano nel modello, che inizia a diventare un nuovo cestino per la logica dell'applicazione.
I controller skinny sono, in effetti, una buona idea, ma il corollario - mettere tutto nel modello, non è proprio il piano migliore.
In Ruby hai un paio di buone opzioni per rendere le cose più modulari. Una risposta abbastanza popolare è usare solo i moduli (di solito nascosti lib
) che contengono gruppi di metodi e quindi includere i moduli nelle classi appropriate. Questo aiuta nei casi in cui si hanno categorie di funzionalità che si desidera riutilizzare in più classi, ma in cui la funzionalità è ancora teoricamente collegata alle classi.
Ricorda, quando includi un modulo in una classe, i metodi diventano metodi di istanza della classe, quindi finisci con una classe che contiene una tonnellata di metodi, sono semplicemente organizzati in modo semplice in più file.
Questa soluzione può funzionare bene in alcuni casi - in altri casi, vorrai pensare all'utilizzo di classi nel tuo codice che non siano modelli, viste o controller.
Un buon modo di pensarci è il "principio della singola responsabilità", secondo il quale una classe dovrebbe essere responsabile di un singolo (o piccolo numero) di cose. I tuoi modelli sono responsabili della persistenza dei dati dalla tua applicazione al database. I responsabili del trattamento sono responsabili della ricezione di una richiesta e della restituzione di una risposta valida.
Se si dispone di concetti che non rientrano esattamente in quelle scatole (persistenza, richiesta / risposta di gestione), probabilmente avrete bisogno di pensare a come si potrebbe modellare l'idea in questione. Puoi archiviare classi non modello in app / classi o in qualsiasi altro luogo e aggiungere quella directory al percorso di caricamento effettuando:
config.load_paths << File.join(Rails.root, "app", "classes")
Se stai usando passeggero o JRuby, probabilmente vorrai anche aggiungere il tuo percorso ai percorsi di carico desiderosi:
config.eager_load_paths << File.join(Rails.root, "app", "classes")
La linea di fondo è che una volta arrivato a Rails in cui ti trovi a porre questa domanda, è tempo di rinforzare le tue costolette di Ruby e iniziare a modellare le classi che non sono solo le classi MVC che Rails ti offre di default.
Aggiornamento: questa risposta si applica a Rails 2.xe versioni successive.