Здесь особых сложностей не возникло. С фильтрацией действий на контроллерах рельсы сами по себе справляются, по-моему, вполне неплохо, главное учесть все варианты. В этом сильно помогает написание функциональных тестов.
Контроллер для товаров приведен ниже. Фильтры before_action не пропускают юзеров туда, куда им ходить не следует. При дальнейшем расширении, даже не смотря на растущие условия типа current_user.is_some_type_1? || current_user.is_some_type2? || current_user.is_some_type3?, мне кажется такое решение вполне устойчивым и расширяемым. Можно ли это сделать как-то еще оптимальнее?
С views все хуже, в них логика очень быстро накапливается и становится плохо отслеживаемой, ниже приведена пара примеров. Я гуглил по этому поводу, советует использовать декораторы. Какой наиболее правильный способ реализации этого паттерна в рельсах? Гем Draper вроде бы является самым рекомендуемым решением.
Еще вопрос по логике в views c формами. Админ и владелец магазинов оба могут редактировать товары, только редактировать они могут разные атрибуты. Решил я это через if elsif внутри партиала (файл _product_form.html.haml). Адекватное ли это решение, или можно лучше? Думаю, что как минимум нужно еще больше поделить на партиалы.