我正在研究Ruby on Rails项目。我想获得这种UI格式:
我尝试了以下代码,但未获得正确的结果。用户可以根据权限动态创建控制器,因此控制器可以是任何对象(用户,角色,权限等)
控制器
def display
param = params[:role]
id=param[:id]
@permission = Role
.joins(:permissions)
.where('roles.id=?',id)
.select('permissions.*')
end
@permission的结果
[#<Role id: 4, name: "index", controller: "User", created_at: "2018-08-21
06:29:47", updated_at: "2018-08-24 06:39:37">,
#<Role id: 16, name: "create", controller: : "User", created_at: "2018-08-24
07:11:08", updated_at: "2018-08-24 07:11:08">,
#<Role id: 21, name: "destroy", controller: : "User", created_at: "2018-08-
24 07:31:17", updated_at: "2018-08-24 07:31:17">,
#<Role id: 25, name: "update", controller: : "User", created_at: "2018-08-24
07:52:00", updated_at: "2018-08-24 07:52:00">,
#<Role id: 26, name: "edit", controller: : "Role", created_at: "2018-08-27
06:38:39", updated_at: "2018-08-27 06:38:39">]>
视图
<%= link_to 'Create', new_permission_path %>
<br/>
<thead>
<tr>
<th width="25px"><%= "User" %></th>
</tr>
<tr>
<% @permission.each do |p| %>
<% if (p.controller== 'User') %>
<th width="25px"> <%= check_box_tag "p[]", p.id %> <%= p.name %></th>
<% end %>
<% end %>
</tr>
</thead>
答案 0 :(得分:1)
我认为您的结构应如下所示
角色模型
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
主题类是控制器的名称,动作是动作的名称。
在视图中,您可以像下面那样加载所有角色和权限,我在视图中使用了手风琴,因此您可能需要根据需要更新视图
<% 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: []