Rails: как правильно разделить представления (view) разных ролей пользователей?
Здравствуйте
В системе присутствует 4 роли пользователей(devise+cancan). Сейчас проверка на роль происходит в контроллерах сущностей и во вьюхах, но это было временное и точно не правильное решение. На данный момент необходимо ввести ещё одну роль пользователя. Поэтому решил переделать процесс. Пока решением считаю проверку на роль в application_contoller'e и перенаправления на определенный namescape. Подскажите может этот вариант не совсем верный для данной ситуации и есть более правильное решение?
Мы использовали https://github.com/inossidabile/protector и танцевали во вьюхах от видимости атрибутов, что дает достаточное удобство, так как не меняя вьюхи можно менять логику работы ролей и вводить новые
У меня пока так и реализовано многие куски кода взяты в блоки if can? ... end + в контроллерах идет проверка ролей пользоваля. Но новая роль координально отличается от остальных и многие вьюхи надо снабжать большими кусками лишнего кода. Поэтому я и думаю как можно разделить более правильно.
Может поможет определить свои резолвер для шаблонов, который в качестве дополнительно параметра будет использовать роль, тогда можно будет разделить вьюхи на отдельные файлы.
Например как вот тут сделано: blog.plataformatec.com.br/2011/04/default-views-in...
Сам не проверял еще этот подход, но думаю должно получиться реализовать, его для всего приложения, поместив в ApplicationController, тогда если есть шаблон для нужной роли, будет выбран он, иначе обычный.
А теорию сегодня проверю, может даже некоторый гем сформируется.
Почему? можно же я так понимаю сколько хочешь шаблонов сделать для каждой конкретной роли users/show.admin.html.haml
users/show.manager.html.haml users/show.operator.html.haml и т.д. в чём загвоздка?
Вот в том то и дело что у меня так может быть, и так пока реализовано. В cancan ability у меня реализовано наследование как тут описано https://github.com/ryanb/cancan/wiki/Role-Based-Au... . Но с подстановкой той или иной вьюхой придется просто алгоритм прописать в application_controller чтобы всё таки выдавать определенную view. Т.е. например если есть обе роли, то выдавать только одну определенную. Вообще конечно я уже думаю переписать этот момент сделать связку has_one, а не HABTM.
Мысль всё таки разграничить всё namespac'ами , проверять в application контроллере принадлежность пользователя той или иной роли и назначение namespac'a. Им будет удобнее , т.к. контроллеры для разных ролей пользователей будут тоже разные, соответственно в них не нужно будет делать ветвистые проверки для выборки сущностей доступных роли.