Я думаю, что ваша структура должна быть как ниже
образец для подражания
class Role < ApplicationRecord
has_many :role_permissions
has_many :permissions, through: :role_permissions, dependent: :destroy
end
модель разрешения
class Permission < ApplicationRecord
has_many :role_permissions
has_many :roles, through: :role_permissions, dependent: :destroy
end
и средняя таблица между ролью и разрешениями
class RolePermission < ApplicationRecord
belongs_to :role
belongs_to :permission
end
Создать данные из seed.rb
Role.create!(name: admin)
Permission.create!([
{subject_class: 'Users', action: 'create',name: 'Create a User',description: 'nil', title: "Users"},
{subject_class: 'Users', action: 'index',name: 'List users',description: 'nil', title: "Users"},
{subject_class: 'Users', action: 'update',name: 'Update User',description: 'nil', title: "Users"},
{subject_class: 'Users', action: 'destroy',name: 'Remove User',description: 'nil', title: "Users"},
{subject_class: 'Users', action: 'show',name: 'Show User',description: 'nil', title: "Users"},
Role.first << Permission.all
Subject Class - это имя контроллера, а action - имя действия.
В представлении вы можете загрузить все роли и разрешения, как показано ниже, я использовал аккордеон в моем представлении, поэтому вам может потребоваться обновить представление в соответствии с вашими потребностями
<% roles = Role.includes(:permissions).all %>
<% uniq_controller = Permission.all.group_by { |p| p.title } %>
<div class="accordion panel-group" id="accordion2">
<% uniq_controller.each do |permission| %>
<div class="panel panel-default">
<%= link_to "##{permission.first}" ,data: {parent: "#accordion2", toggle: "collapse"} do %>
<div class="panel-heading">
<h3 class="panel-title">
<%= permission.first.gsub("_"," ") %>
</h3>
</div>
<% end %>
<div id="<%= permission.first %>" class="panel-collapse collapse">
<div class="collapse show" role="tabpanel" aria-labelledby="headingOne">
<div class="card-block">
<table>
<% permission.second.each do |cont| %>
<tr>
<td><%= cont.name %></td>
<td>
<%= f.check_box :permission_ids, {multiple: true}, cont.id, nil %></td>
</tr>
<% end %>
</table>
</div>
</div>
</div>
</div>
<% end %>
</div>
В контроллере просто добавьте permission_ids: []
в параметрах разрешения