- Пишите на Рельсах? Пишите по-Рельсовому. Забейте на DRY/KISS/SOLID и т.п. Если можно сделать тупее, быстрее, средствами рельс - делайте. Коллбэки, валидация и логика в моделях - это ок. Пока не начнёт болеть. Тогда выносить.
- Разделяйте контроллеры по представлениям. А представления по bounded context. Контроллер должен быть максимально прямолинейный, без if-ов. Достал инфу в одном виде. В том же виде отрендерил. Если приходится инфу как-то готовить для разных случаев, значит вам нужен еще один контроллер
- Делайте иерархию контроллеров. И на каждом уровне - корневой, в котором будут общие для всех наследников вещи (например аутентификация, какие-то ещё хуки)
- Тестируйте экшены на 200/404, и в идеале на возвращаемые данные/изменения в БД которые произвёл экшн. Этого достаточно
- Minitest + power-assert рулит. Не юзайте матчеры. Вам покажут где больно.
- Делайте просто и легко там где это не будет трогаться, и меняться еще долго. Но если видите что постоянно происходят правки в каком-то месте кода (churn rate), то там старайтесь довести до идеала
- Не руководствуйтесь тем что: "это не соответствует паттерну", "у нас так в rubocop записано", "слишком длинная строка", "слишком много строк в методе". Используйте голову. Если вы видите, и вся команда согласна что тут тяжело понять - значит надо переделать