Rails cancancan, как ограничить права пользователя в поле зрения при большом количестве ролей?

Rails cancancan, как ограничить права пользователя в поле зрения при большом количестве ролей? И каждая роль имеет несколько привилегий. Например, в моем приложении rails есть около 50 файлов представлений, таких как article.html.erb, product.html.erb, comment.html.erb, order.html.erb, ... и так далее. Что мне нужно сделать, так это добавить привилегии в каждый файл .html.erb:

 <% if can? :update, @article %>
    <%= link_to "Edit", edit_article_path(@article) %>
 <% end %>
...
 <% if can? :update, @product %>
    <%= link_to "Edit", edit_product_path(@product) %>
 <% end %>

Так что, если так, мне придется проделать много утомительной работы. Когда запрос изменяется, мне нужно изменить несколько файлов .html.erb.

Итак, мой вопрос: есть ли какие-то методы, которые я могу принять, чтобы избежать этого? Например, использование глобального тега для управления всеми представлениями, чтобы отображать или не отображать методы «Edit», «Destroy»?


person Laker    schedule 17.03.2017    source источник


Ответы (1)


Вы можете использовать макеты в направляющих.
Создайте частичное представление, скажем _user_privileges.html.erb внутри layouts папки в app/views и напишите туда код, связанный с привилегиями. Теперь в каждом из других файлов просмотра вы можете использовать <%= render 'layouts/user_privileges' %>. Итак, теперь вы можете использовать один файл для изменения привилегий.

_user_privileges.html.erb

<% if can? :update, @article %>
    <%= link_to "Edit", edit_article_path(@article) %>
 <% end %>
...
 <% if can? :update, @product %>
    <%= link_to "Edit", edit_product_path(@product) %>
 <% end %>

article.html.erb, product.html.erb, comment.html.erb, order.html.erb и т. д.

...
<%= render 'layouts/user_privileges'  %>
...
person Sajin    schedule 17.03.2017
comment
Если я создаю частичное представление, мне придется менять частичное представление каждый раз по мере изменения потребностей разработки. Итак, мой вопрос: могу ли я просто добавить тег в представление или более простой способ, например, использовать для этого драгоценный камень? Если есть драгоценный камень или более простой способ сделать это, я буду признателен. @Sajin - person Laker; 04.05.2017