Я использую в Rails cancan
gem, но это, вероятно, более общий.Логика приложения против авторизации
Краткое введение. В cancan
, можно определить разрешение, как это:
can :read, Post
can :manage, Post if user.is_admin?
can :manage, Post do |post| post.author == user end
Это будет означать, что любой человек может прочитать Post
с, но только автор и администраторы могут управлять (редактировать/уничтожить) их.
Теперь я хотел бы изменить свою логику приложения, чтобы вы не могли удалить сообщение, если у него есть какие-либо комментарии (если вы не являетесь администратором). Это по-прежнему легко с cancan
(добавлено в конце предыдущего фрагмента кода):
cannot :destroy, Post do |post| post.comments.count > 0 && !user.is_admin? end
А это значит, что я могу использовать следующий псевдокод в представлении (шаблон HTML):
<h1><%=post.title%></h1>
<p><%=post.text%></p>
<%=link_to 'Edit', edit_post_path(post) if can? :edit, post%>
<%=link_to 'Delete', delete_post_path(post) if can? :destroy, post%>
Мой вопрос только в том разумно ли смешивать разрешения с логикой приложения? Он чувствует себя вид грязный, но с другой стороны, я должен был бы сломать DRY и заменить это двойной проверки везде в приложении (внешний интерфейс, API и т.д.)
<h1><%=post.title%></h1>
<p><%=post.text%></p>
<%=link_to 'Edit', edit_post_path(post) if post.can_be_edited? && can? :edit, post%>
<%=link_to 'Delete', delete_post_path(post) if post.can_be_destroyed? && can? :destroy, post %>