Raylar MVC açısından yapısını sağladığından, kullanarak sonuna doğaldır sadece sizin için verilmiştir modeli, görünüm ve denetleyici kapları. Yeni başlayanlar (ve hatta bazı ara programcılar) için tipik deyim, uygulamadaki tüm mantığı modele (veritabanı sınıfı), denetleyiciye veya görünüme sıkıştırmaktır.
Bir noktada, birisi "yağ modeli, sıska denetleyici" paradigmasına dikkat çekiyor ve ara geliştiriciler aceleyle her şeyi kontrolörlerinden çıkarıyor ve uygulama mantığı için yeni bir çöp kutusu olmaya başlayan modele atıyor.
Sıska kontrolörler aslında iyi bir fikir, ancak sonuç - her şeyi modele koymak, gerçekten en iyi plan değil.
Ruby'de, işleri daha modüler hale getirmek için birkaç iyi seçeneğiniz var. Oldukça popüler bir cevap, sadece lib
yöntem gruplarını tutan ve daha sonra modülleri uygun sınıflara dahil eden modülleri (genellikle saklanır ) kullanmaktır . Bu, birden fazla sınıfta yeniden kullanmak istediğiniz işlevsellik kategorilerine sahip olduğunuz, ancak işlevselliğin yine de sınıflara bağlı olduğu durumlarda yardımcı olur.
Bir sınıfa bir modül eklediğinizde, yöntemler sınıfın örnek yöntemleri haline gelir, bu yüzden yine de tonlarca yöntem içeren bir sınıfla sonuçlanırsınız, bunlar çok sayıda dosyada güzelce düzenlenmiştir.
Bu çözüm bazı durumlarda iyi çalışabilir - diğer durumlarda, kodunuzda model, görünüm veya denetleyici olmayan sınıfları kullanmayı düşünmek isteyeceksiniz .
Bunu düşünmenin iyi bir yolu, bir sınıfın tek (veya az sayıda) şeyden sorumlu olması gerektiğini söyleyen "tek sorumluluk ilkesi" dir. Modelleriniz, uygulamanızdan veritabanına kadar olan verilerin kalıcı olmasından sorumludur. Denetleyicileriniz bir istek almaktan ve uygun bir yanıt döndürmekten sorumludur.
Bu kutulara tam olarak uymayan kavramlarınız varsa (kalıcılık, istek / yanıt yönetimi), muhtemelen söz konusu fikri nasıl modelleyeceğinizi düşünmek istersiniz . Model dışı sınıfları uygulama / sınıflarda veya başka herhangi bir yerde saklayabilir ve şunları yaparak bu dizini yükleme yolunuza ekleyebilirsiniz:
config.load_paths << File.join(Rails.root, "app", "classes")
Yolcu veya JRuby kullanıyorsanız, muhtemelen istekli yükleme yollarına da yol eklemek istersiniz:
config.eager_load_paths << File.join(Rails.root, "app", "classes")
Sonuç olarak, Rails'te bu soruyu sorduğunuz bir noktaya geldiğinizde, Ruby pirzolalarınızı güçlendirmenin ve sadece Rails'in varsayılan olarak verdiği MVC sınıfları olmayan sınıfları modellemeye başlamanın zamanı geldi.
Güncelleme: Bu cevap Rails 2.x ve üstü için geçerlidir.