Оскільки Rails надає структуру з точки зору MVC, природно в кінцевому підсумку використовувати лише контейнери моделі, перегляду та контролера, які надаються вам. Типова ідіома для початківців (і навіть деяких проміжних програмістів) полягає в тому, щоб зафіксувати всю логіку в додатку до моделі (клас бази даних), контролера або перегляду.
У якийсь момент хтось вказує на парадигму "жировики, скинни-контролера", а проміжні розробники поспішно викреслюють все зі своїх контролерів і кидають його в модель, яка починає стати новим смітником для логіки застосування.
Худі контролери - це насправді хороша ідея, але наслідки - все, що є в моделі, насправді не найкращий план.
У Ruby у вас є кілька хороших варіантів зробити речі більш модульними. Досить популярною відповіддю є просто використання модулів (як правило, прихованих lib
), які містять групи методів, а потім включення модулів у відповідні класи. Це допомагає у випадках, коли у вас є категорії функціональних можливостей, які ви хочете повторно використовувати в декількох класах, але коли функціональність все ще умовно додається до класів.
Пам'ятайте, коли ви вмикаєте модуль в клас, методи стають методи екземпляра класу, так що ви до сих пір в кінцевому підсумку з класом , що містить масу методів, вони просто організовані красиво на кілька файлів.
Це рішення може спрацювати добре в деяких випадках - в інших випадках вам потрібно буде подумати про використання класів у коді, які не є моделями, переглядами чи контролерами.
Хороший спосіб подумати над цим - "принцип єдиної відповідальності", який говорить про те, що клас повинен відповідати за одну (або невелику кількість) речей. Ваші моделі відповідають за збереження даних із вашої програми до бази даних. Ваші контролери несуть відповідальність за отримання запиту та повернення життєздатної відповіді.
Якщо у вас є концепції, які не чітко вписуються в ці поля (наполегливість, управління запитами / відповідями), ви, ймовірно, хочете подумати над тим, як би ви змоделювали цю ідею. Ви можете зберігати немодельні класи в додатках / класах або в будь-якому іншому місці та додавати цей каталог у свій шлях завантаження, виконавши:
config.load_paths << File.join(Rails.root, "app", "classes")
Якщо ви використовуєте пасажирський або JRuby, ви, ймовірно, також хочете додати свій шлях до нетерплячих шляхів навантаження:
config.eager_load_paths << File.join(Rails.root, "app", "classes")
Суть полягає в тому, що, як тільки ви доберетесь до пункту Rails, де вам здається, що ви задаєте це питання, настав час поповнити свої рубінові відбивні та почати моделювати класи, які не є лише класами MVC, які Rails дає вам за замовчуванням.
Оновлення: ця відповідь стосується Rails 2.x та новіших версій.