在Rails上使用ruby获取正确格式的UI的问题

时间:2018-08-28 07:10:10

标签: ruby-on-rails ruby

我正在研究Ruby on Rails项目。我想获得这种UI格式:

enter image description here

我尝试了以下代码,但未获得正确的结果。用户可以根据权限动态创建控制器,因此控制器可以是任何对象(用户,角色,权限等)

控制器

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>

1 个答案:

答案 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: []