Ієрархія контролерів

У більшості зустрічалися мені проекти rails, структура контролерів не має ніякої організації і проект зростає як доведеться. У великих проектах це призводить до того, що контролери стають величезними (з десятками actions), а умовні фільтри розтягуються на весь екран. Розібратися в такому коді дуже непросто.

Попрацювавши з великою кількістю проектів rails, у мене був сформований підхід до організації ієрархії контролерів, яка дозволила уніфікувати їх структуру і спростити код.

Верхній рівень

Насамперед зручно на верхньому рівні розташувати основні неймспейси проекту, такі як web, mobile, api, feeds та інші. При цьому модуль admin перебуватиме у web.

контролерів

Всередині апі можна виділити підмодулі, розділені за версією, наприклад, v1, v2. Або робити папки на верхньому рівні api1, api2 тощо. link: freelancing-gods.com/posts/versioning_your_ap_is

Я використовую таку структуру навіть у найпростіших випадках. Практика показує, що будь-яка з цих складових легко може додатись тоді, коли цього ніхто не планував.

Для кожного модуля створюється Namespace::ApplicationController для того, щоб не змішувати логіку, що підходить для конкретних неймспейсів.

можна

Але у роутингу будуть невеликі відмінності для різних модулів. Web задається як scope. В результаті ми отримаємо хелпери без зайвих префіксів, а ось для інших використовується namespace.

контролерів

Вкладені ресурси

У цьому випадку буде розумним створити модулі для відповідних ресурсів.

можна

І для кожного неймспейсу буде власний ApplicationController, що містить загальні методи модуля.

контролерів

Для всіх контролерів, що знаходяться в цьому модулі, буде доступнийcurrent_section без фільтрів.

Контролери стають менше та простіше. Дивлячись на структуру контролерів вже багато можна сказати про те, як організований проект і чого можна очікувати в конкретному контролері. Має багато умовних фільтрів. Спрощується тестування; Єдиний організаційний підхід;

Так само, для зручності та однаковості, вхідні контролери неймспейсу обзиваються welcome. І підключаються в роутах через root: to => 'welcome#index' усередині відповідного scope. Реальний приклад:

Розглянемо як організувати контролери реальному прикладі. Допустимо потрібно було зробити інтеграцію з facebook.

Підхід із поділом:

У даному випадку про користувача ще нічого не відомо, а ось при зміні інтеграції (наприклад, налаштування автошарингу) або видаленні ми працюємо з конкретним користувачем. Це можна реалізувати, наприклад, так:

У результаті замість одного контролера ми отримали два (але може бути і більше, якщо завдання цього вимагатиме), але при цьому всі методи згруповані за варіантами використання.

А у нас тут можна отримати грант на тестовий період Яндекс.Хмари. Варто лише у полі «секретний пароль» запровадити «Хабр»