Корректно ли завязывать layouts и views на роль пользователя системы.

40 views
Skip to first unread message

apavlyut

unread,
Jan 31, 2012, 12:09:22 PM1/31/12
to ror...@googlegroups.com
guys, hi.

Приложение плотнро завязано сейчас на три роли помимо админов - возможности у всех разные, уровень доступа у всех разный, но есть общие элементы - дизайн / верстка / блоки, расположение всего - комменты, и прочее. 

Пока устроено так - если ты такой, рендерим комменты, если ты не такой - комменты видеть не будешь.

Навскидку таких "если" в ближайшее время появится очень много => много условий в темплейтах, не айс раз.

Два - основная проблема - один тип пользователя ни в коем случае никогда (!!!) не должен видеть то что ему не положено о другом пользователе, иначе все плохо.

Самый надежный способ избежания такой лажи (ошибочки в услоии / скоупе или пр) - завести не только layout под роль, но и что-то типа - index.killer.html.haml | index.victim.html.haml и соответсвенно layout.killer.html.haml и layout.victim.html.haml.

В краце - это что-то типа игры, вьюх много и будет много, количество ролей будет расти, но не более 15-20 что терпимо для такого хранения внешнего вида.

Кто нибудь так делал?

Есть ли другое решение?

Спасибо за архитектурные советы.

Андрей

unread,
Jan 31, 2012, 12:45:33 PM1/31/12
to ror...@googlegroups.com
Можно спросить, а чем разделение прав по ролям + тесты вас не устраивают? Зачем изобретать франкенштейна?

apavlyut

unread,
Jan 31, 2012, 1:24:13 PM1/31/12
to ror...@googlegroups.com
а чем разделение прав по ролям + тесты вас не устраивают? 

Важность непопадания ошибки в продакшн. Может и сильно надумано, но выглядит надежно и понятно.

На практике бывает что проскакивают неочевидные ошибки мимо тестов. 

Во всяком случае написание теста не гаранитрует 100% безотказность. 

Не все варианты предусматриваются наперед.

> Зачем изобретать франкенштейна?

Во первых это вполне гарантированный вариант непопадания одного в другое (роль назначается жестко и сразу и это точно не проскакивает мимо тестов и валидаций).

Один кастомный инициализатор на пару строк это не франкинштейн, и вполне даже в рамках rails way.

Посмотрите как приятно организовано разделение темплейтов по локалям - чем не вариант если роли так же плотно как и в случае с локалью участвуют в приложении?

Как раз таки условия (if / case) в темплейтах / контроллерах выглядит как франкинштейн.

Alex Vasyutin

unread,
Jan 31, 2012, 2:48:36 PM1/31/12
to ror...@googlegroups.com
On Tuesday, January 31, 2012 at 10:24 PM, apavlyut wrote:

Посмотрите как приятно организовано разделение темплейтов по локалям - чем не вариант если роли так же плотно как и в случае с локалью участвуют в приложении?
Вот уж по-моему сомнительное решение, бить темплейты по локалям. Мне удобнее в yml-ях хранить то, что в темплейтах хардкодится. И верстальщику проще, не надо поддерживать кучу одинаковых шаблонов для разных языков.

EXO

unread,
Jan 31, 2012, 8:07:20 PM1/31/12
to RubyOnRails to russian
On 31 янв, 23:09, apavlyut <apavl...@gmail.com> wrote:
> Навскидку таких "если" в ближайшее время появится очень много => много
> условий в темплейтах, не айс раз.

Вариант: внести это внутрь "роли". То есть сделать роль не просто
названием, а профилем-хешем.
Тогда условия в темплейтах примут вид: if @user.role.enable_kills? и
лкальны для каждого блока в темплейте.
А профилей можно насоздавать сколько угодно.

Alexey Bondar

unread,
Feb 1, 2012, 1:01:47 AM2/1/12
to ror...@googlegroups.com
А у вас есть не RTL, а LTR языки? Если да, то как вы решаете эту проблему через yml? 

--
--
Данное сообщение отправлено Вам, так как Вы являетесь подписчиком группы "RubyOnRails to russian" на группах Google.
FAQ группы находится по адресу: http://ru.wikibooks.org/wiki/RubyFAQ
 
Для того, чтобы отправить сообщение в эту группу, пошлите его по адресу
ror...@googlegroups.com
Чтобы отменить подписку на эту группу, отправьте сообщение по адресу: ror2ru-un...@googlegroups.com
Дополнительные варианты находятся на странице группы http://groups.google.com/group/ror2ru?hl=ru

Alexey Bondar

unread,
Feb 1, 2012, 1:03:29 AM2/1/12
to ror...@googlegroups.com

On 1 Feb 2012, at 10:01, Alexey Bondar wrote:


On 31 Jan 2012, at 23:48, Alex Vasyutin wrote:

On Tuesday, January 31, 2012 at 10:24 PM, apavlyut wrote:

Посмотрите как приятно организовано разделение темплейтов по локалям - чем не вариант если роли так же плотно как и в случае с локалью участвуют в приложении?
Вот уж по-моему сомнительное решение, бить темплейты по локалям. Мне удобнее в yml-ях хранить то, что в темплейтах хардкодится. И верстальщику проще, не надо поддерживать кучу одинаковых шаблонов для разных языков.

А у вас есть не RTL, а LTR языки? Если да, то как вы решаете эту проблему через yml? 

Доброе, гхм, утро: читать как «не LTR, а RTL». 

Alex Vasyutin

unread,
Feb 1, 2012, 3:45:00 AM2/1/12
to ror...@googlegroups.com
On Wednesday, February 1, 2012 at 10:03 AM, Alexey Bondar wrote:
Доброе, гхм, утро: читать как «не LTR, а RTL». 
Нет, у нас только обычные:)  В случае RTL да, yml-ями не обойтись, нужно кардинально менять шаблон.
Но это по-моему более чем исключительный случай:)

Anton Kosyakin

unread,
Feb 1, 2012, 5:04:20 AM2/1/12
to RubyOnRails to russian
+1, присоединяюсь. Имхо довольно простой и логичный вариант. На каждый
блок - свой партиал/теплейт, а в свойствах роли - указана видимость
того или иного блока.

apavlyut

unread,
Feb 1, 2012, 5:31:38 AM2/1/12
to ror...@googlegroups.com
Похоже на правду

oleg dashevskii

unread,
Feb 2, 2012, 10:20:42 AM2/2/12
to ror...@googlegroups.com
Вешайте на все блоки, видимые только определенным ролям, соответствующий css класс. Сделайте middleware, которое парсит сгенерированную страницу, запускает nokogiri и выкашивает все блоки, не соответствующие текущей роли, а оставшееся отдает клиенту.

Свободу паранойе!

1 февраля 2012 г. 17:31 пользователь apavlyut <apav...@gmail.com> написал:
Похоже на правду

--
--
Данное сообщение отправлено Вам, так как Вы являетесь подписчиком группы "RubyOnRails to russian" на группах Google.
FAQ группы находится по адресу: http://ru.wikibooks.org/wiki/RubyFAQ
 
Для того, чтобы отправить сообщение в эту группу, пошлите его по адресу
ror...@googlegroups.com
Чтобы отменить подписку на эту группу, отправьте сообщение по адресу: ror2ru-un...@googlegroups.com
Дополнительные варианты находятся на странице группы http://groups.google.com/group/ror2ru?hl=ru



--
Олег.
Reply all
Reply to author
Forward
0 new messages