Organizowanie kodu źródłowego kontrolerów aplikacji

Zastanawiam się w jaki sposób organizujecie kod źródłowy złożonych aplikacji, gdzie jest wiele kontrolerów. Oczywiście w grę wchodzi przypadek gdzie aplikacja jest mniej lub bardziej REStowa, więc logiczne wydaje się zorganizowanie kodu źródłowego w moduły (i foldery) odpowiadające poszczególnym zasobom REST.

Ja to robię tak, że jak mam kontrolery do zarządzania użytkownikiem, jego komentarzami i ocenami komentarzy to robię to tak:

app/ controllers/ users_controller.rb (UsersController) user/ comment/ ratings_controller.rb (User::Comment::RatingsController) comments_controller,rb (User::CommentsController)
Dodatkowo, jeśli mam wiele kontrolerów zagnieżdżonych w danym zasobie to mogę sobie wyciągnąć klasę bazową, na przykład:

app/ controllers/ user/ base_controller.rb (User::BaseController) comments_controller.rb (User::CommentsController < User::BaseController) reviews_controller.rb (User::ReviewsController < User::BaseController)
Takie podejście wygląda mi dość rozsądnie, może jest troszkę więcej pisaniny przy nazwach klas ale tego się nie używa często. A jak Wy to robicie? Jednym z usprawnień do powyższego schematu może być zastąpienie modułem klas bazowych, ale czy ogólna koncepcja jest również przez Was praktykowana? Jakie są możliwe inne podejścia?

Takie działanie ma sens tylko i wyłącznie wtedy gdy User::BaseController zawiera dodatkową funkcjonalność której nie chciałbyś używać w ApplicationController lub w innych kontrolerach pośrednich dziedziczących po ApplicationController. Jeśli moja aplikacja tego warunku by nie spełniała uznał bym to za dodatkową niepotrzebną prace. Jeśli naprawde tych kontrolerów jest dużo warto po prostu pogrumować je w katalogi i dodać te katlaogi do config.load_paths w envrionment.rb np tak:

config.load_paths += Dir.glob("#{RAILS_ROOT}/app/models/**/") } #Models config.load_paths += Dir.glob("#{RAILS_ROOT}/app/controllers/**/") #Controllers

Ja tworzę podkatalog w controllers tylko dla namespace’ów, np:

map.namespace :admin do |admin| admin.resources :users end
Wtedy mam strukturę:

controllers/ admin_controller.rb admin/ users_controller.rb pages_controller.rb other_things_controller.rb
admin_controller.rb jest bazowym kontrolerem dla wszystkich w admin/ i zawiera rzeczy specyficzne tylko dla tej sekcji aplikacji, np before_filter dla wszystkich kontrolerów z admina:

class AdminController < InheritedResources::Base layout 'admin' before_filter :require_admin end
…a wszystkie kontrolery z admin/ dziedziczą po nim:

class Admin::UsersController < AdminController ... end
A we wszystkich innych przypadkach kontrolery i widoki mam jak najbardziej “płasko” jak się da.