首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Rolify定义角色

用Rolify定义角色
EN

Stack Overflow用户
提问于 2015-11-27 04:14:55
回答 4查看 9.2K关注 0票数 7

我正在尝试用Rails 4制作一个应用程序。

我正在研究角色管理,并希望使用Rolify,因为它支持实例级的角色分配。

对于其他人来看同样的问题,下面有两个非常好的答案(我只能勾选一个,但我使用了两者)。请查看下面的lorefnon & Cyb3rDud3答案)。我仍然在计算它,但已经使用数组(如lorefnon显示)和控制器/路由函数(如Cyb3rDud3所示)进行了迁移。

让我完全困惑的是,Rolify宝石的所有文档都使用控制台来定义角色。

如何在代码中定义角色?

董事会中的其他成员也提出了一些问题,这些问题暗示着他们在db:种子文件中定义了角色。我不想这么做,因为我想控制谁比谁更能使用我的种子文件来创建角色。

你在哪里做的?

所有的例子都显示它是从控制台完成的。我想要定义一个角色列表,然后我想给角色权限(我想使用这一部分的专家)。

我有一个用户模型。我看到的另一个宝石是榜样。它要求您在用户模型中创建一个角色数组。很明显,你应该在Rolify中这样做--没有一个文档给你这一步?

你在哪里定义角色?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-12-02 09:33:43

让我完全困惑的是,Rolify宝石的所有文档都使用控制台来定义角色。

Rolify文档不使用控制台来定义角色--它演示了如何在纯ruby中添加角色。这是非常强大的,因为您可以在任何地方定义角色,只要您可以运行ruby。您不限于在某些配置文件或某些数据库表中定义的静态角色列表。

您需要问的第一个问题是角色是什么时候创建的?

最常见的用例分为两类:

1.角色是静态的.

角色由应用程序开发人员、支持人员或公司管理人员在应用程序安装/部署期间创建一次,在运行应用程序期间,这些预先创建的角色被分配给不同的用户。

这类角色最常见的用例包括对公司中的人员(开发人员、经理、支持等)进行建模,或者对预先已知的职责(编辑、管理员、查看器等)进行建模。

如果您的角色确实属于这样的用例,那么下一步您必须决定--创建和修改角色是谁的责任。通常有两种可能性:

1.1.应用程序开发人员本身就是必须添加/删除/修改角色的人。在这种情况下,最好依靠种子数据或Rails迁移。

迁移的优点是,如果需要,可以轻松地回滚数据。这种迁移是由rolify生成器生成的迁移的补充,rolify生成器为您创建了与角色相关的表模式(参见下面的图表)。

这样的迁移看起来可能是:

db/migrate/20151204083556_create_application_roles.rb

代码语言:javascript
复制
class CreateApplicationRoles < ActiveRecord::Migration
  def up
    ['admin', 'support', 'editor'].each do |role_name|
      Role.create! name: role_name
    end
  end
  def down
    Role.where(name: ['admin', 'support', 'editor']).destroy_all
  end

end

有些人将模式更改和数据更改都通过迁移来管理,这是一种反模式。数据迁移是一个gem,它允许您将以数据为中心的迁移与模式迁移分离开来。

在这种情况下,以及下面的所有其他情况下,通过add_roleremove_role方法通过rolify.This提供的用户操作或应用程序事件将发生在运行应用程序的生命周期中,而不是在应用程序安装过程中。

1.2添加/删除/修改角色的任务由支持团队或技术主管完成。在这种情况下,需要提供一个管理角色的管理接口。

在这种情况下,您将有一个rails控制器来管理角色。创建操作将用于创建角色,显示操作将显示角色等。这些操作将具有附带的视图,这些视图将为最终用户提供图形用户界面来管理角色。

2.角色是动态的

这个类别涵盖了角色更像类别或标签,并且可以由最终用户创建/修改/删除的用例。例如,图书管理员可以将某些角色/类别分配给特定类型的书籍。

这种情况类似于1.2,因为您必须通过rails控制器处理创建/删除/更新角色。

下一部分是如何在表中构造信息。

Rolify期望有一个特定的模式(在一定程度上是可定制的),但是预期的模式足够灵活,可以处理上述所有用例。

票数 12
EN

Stack Overflow用户

发布于 2015-12-05 10:34:46

我刚刚经历了同样的过程,就像@ just 2860931一样,我所能找到的只是一些如何从控制台分配角色的例子。我需要的是一种编程上灵活的方法,说明具有管理角色的用户或具有pmo角色的用户如何将这些角色分配给其他人。

通过一些实验,这就是我解决这个问题的方法。在本例中,我使用Devise身份验证,而Rolify用于角色。

我假设您已经设计了已经安装和工作的,因此您有一个现有的用户模型。按照宝石页面上的说明安装Rolify。我为角色模型使用了建议的名称角色。所以,按照这里所说的做每件事:https://github.com/RolifyCommunity/rolify。安装创业板,使用rolify生成角色用户。并迁移数据库迁移。

这将有效地为您留下一个新的表角色和与User表的has_and_belongs_to_many关系。

至于我的目的,我不需要通常的created (显示) Update (CRUD)接口来处理角色,我只是通过seeds.rb创建了一些这样的界面。

代码语言:javascript
复制
#Seeding the Role table
#
p "Removing existing #{Role.all.count} roles"
Role.destroy_all
p "Creating 7 roles"
[:user, :admin, :portfolio_manager, :programme_manager,     :project_manager, :coordinator, :pmo].each do |role|
  Role.create( name: role )
end
p "Should have created 7 Roles, roles created: #{Role.all.count}"

我已经把我的补充评论留在了我对开发的东西中,所以我可以一眼就看到它工作得很好。所以当你跑的时候

rake db:种子

你会有一些角色设置。或者,您可以按照通常的方式创建角色、控制器和视图,例如允许具有管理角色的用户添加新角色。

现在,乐趣可以开始了。到目前为止,Devise已经完成了所有关于用户的操作,或者您可能已经完成了自己的控制器,但是您需要创建自己的用户控制器和视图。因为我只想要一个针对每个用户的角色的勾选框列表,我这样做了如下。这是我的

代码语言:javascript
复制
users_controller.rb

class UsersController < ApplicationController
  before_action :set_user, only: [:show, :edit, :update]

  def index
    @users = User.all
  end

  def show
  end

  def edit
  end

  def update
    respond_to do |format|
      if @user.update(user_params)
        # TODO: Move hardcode flash message into language file
        format.html { redirect_to @user, notice: 'User was successfully updated.'}
        format.json { render :show, status: :ok, location: @user }
      else
        format.html { render :edit }
        format.json { render json: @user.errors, status: :unprocessable_entity }
      end
    end
  end

  private

  def set_user
    @user = User.find(params[:id])
  end

  def user_params
    params.require(:user).permit(:username, :email, {role_ids: []})
  end
end

现在,您必须定义这些路径,这样它们就不会与设计路线发生冲突。我一直保持它简单,目前和资源,所有通常的路线,以加强您的应用程序,您可能想要改变,并只允许那些路线,你实际拥有。

代码语言:javascript
复制
routes.rb

Rails.appliction.routes.draw do
  devise_for :users
  root 'pages#home'
  resources :users    #must be after devise
end

当您现在执行rake路由时,您将得到应用程序使控制器工作的常用路径。就像这样,按照顺序:

代码语言:javascript
复制
                  Prefix Verb   URI Pattern                      Controller#Action
        new_user_session GET    /users/sign_in(.:format)       devise/sessions#new
            user_session POST   /users/sign_in(.:format)       devise/sessions#create
    destroy_user_session DELETE /users/sign_out(.:format)      devise/sessions#destroy
           user_password POST   /users/password(.:format)      devise/passwords#create
       new_user_password GET    /users/password/new(.:format)  devise/passwords#new
      edit_user_password GET    /users/password/edit(.:format) devise/passwords#edit
                         PATCH  /users/password(.:format)      devise/passwords#update
                         PUT    /users/password(.:format)      devise/passwords#update
cancel_user_registration GET    /users/cancel(.:format)        devise/registrations#cancel
       user_registration POST   /users(.:format)               devise/registrations#create
   new_user_registration GET    /users/sign_up(.:format)       devise/registrations#new
  edit_user_registration GET    /users/edit(.:format)          devise/registrations#edit
                         PATCH  /users(.:format)               devise/registrations#update
                         PUT    /users(.:format)               devise/registrations#update
                         DELETE /users(.:format)               devise/registrations#destroy
             user_unlock POST   /users/unlock(.:format)        devise/unlocks#create
         new_user_unlock GET    /users/unlock/new(.:format)    devise/unlocks#new
                         GET    /users/unlock(.:format)        devise/unlocks#show
                    root GET    /                              pages#home
                   about GET    /about(.:format)               pages#about
                 contact GET    /contact(.:format)             pages#about
                   users GET    /users(.:format)               users#index
                         POST   /users(.:format)               users#create
                new_user GET    /users/new(.:format)           users#new
               edit_user GET    /users/:id/edit(.:format)      users#edit
                    user GET    /users/:id(.:format)           users#show
                         PATCH  /users/:id(.:format)           users#update
                         PUT    /users/:id(.:format)           users#update
                         DELETE /users/:id(.:format)           users#destroy

现在剩下的就是构建用户界面,这对我来说是最重要的部分,如果我对你的理解也是正确的话。为了快速构建这个示例,我的示例还没有提供完整的css魔法,但我相信您可以按照自己的口味来做。

因此,要显示现有用户并从列表中选择他们,请在您的/app/view/ index.html.erb文件夹中创建该列表。创建一个简单的show.html.erb和一个编辑,您可以在其中分配和删除现有角色。就像这样。

代码语言:javascript
复制
index.html.erb

<!-- TODO: Tidy up this file and make it look good -->
<!-- TODO: Remove hard coded text to a locale file -->
<% @users.each do |user| %>
  <p>
    <%= link_to "#{user.username}<#{user.email}>", user %>
    <%= link_to "edit", edit_user_path(user) %>
  </p>
<% end %>

show.html.erb

<!-- TODO: Tidy up this file and make it look good -->
<!-- TODO: Remove hard coded text to a locale file -->
<p>
  Username: <%= @user.username %>
</p>
<p>
  Email address: <%= @user.email %>  
</p>

<%= link_to "Back", users_path %>

edit.html.erb

<!-- TODO: Tidy up this file and make it look good -->
<!-- TODO: Remove hard coded text to a locale file -->
<p>
 Username: <%= @user.username %>
</p>
<p>
 Email address: <%= @user.email %>
</p>

<%= form_for @user do |f| %>
  <% Role.all.each do |role| %>
    <%= check_box_tag "user[role_ids][]", role.id, @user.role_ids.include?(role.id) %>
    <%= role.name %></br>
  <% end %>
  <%= f.submit %>
<% end %>

<%= link_to "Back", users_path %>

这里有一个简单的用户界面,它列出了数据库中的所有可用角色,并提供了针对用户记录的勾选框,以启用或禁用该角色。如下所示:

用户记录和角色选择列表示例

这对我来说也是个小麻烦,但希望这能让你在增加逻辑和用户体验的过程中有所收获。

票数 6
EN

Stack Overflow用户

发布于 2015-11-30 12:31:15

在阅读了项目页面中的文档和示例之后,我决定不使用gem来管理页面中的角色,因为我认为配置和使用需要花费很多时间。因此,我做了以下工作(我相信您在用户模型中使用了devise,尽管它不是强制性的):

如果您想要定义某些角色,并且“静态”不可修改,但可以从页面中指定,请参见下面的,如果不跳到下一个粗体行

  1. 通过迁移将一个名为role: integer的字段添加到User模型中。(我们使用整数,因为这个值将与我们在下一步定义的枚举中的一个条目相关联)
  2. 在您的文件user.rb (模型)中,添加一个enum,如下所示: 类用户 :new_record?def set_default_role self.role ||=:正常端
  3. 然后,在任何控制器、视图或def中,您只需获得当前用户或您想要分配角色的任何用户,并且只需执行以下一行的简单操作: #让我们假设我们想让当前用户current_user.premium!#或其他人成为管理用户= User.first user.admin!
  4. 然后,只需询问用户的角色,就可以在您正在处理的任何页面或控制器中进行自己的验证: #查看当前用户是否为admin,如果current_user.role == " admin“#做一些管理工作

如果要在页面中添加、修改和删除角色,并在其中分配角色,则为

首先,在直接从页面分配角色时要小心。这里的问题是,每个人都可以给自己指定自己在某一领域中所选择的角色。但是,如果这是你所需要的,请按以下步骤操作:

  1. 使用字段Role创建一个名为role: string的模型
  2. 创建与该模型关联的控制器,roles_controller.rb
  3. 创建您需要的视图,以显示与角色管理(创建、编辑、删除)相关的操作,请注意此页面只能用于用户签名。您将在用户控制器或任何其他控制器中管理的用户的角色的选择或添加。
  4. 在任何其他视图中,您都需要请求用户的角色,您需要访问角色表并检索与用户对应的角色。用户表需要一个列role_ids: text (它的文本,因为您需要在那里保存多个角色,所有角色都封装在一个数组中),这将代表他的角色。在您的user.rb模型中,您可以有一个get_roles和其他def方法,以便在控制器和视图中有更清晰的代码: 类用户
  5. 最后,您当然需要为角色、创建、更新和销毁以及与其视图相关的所有def实现控制器。

你可以看看如何将数组保存在数据库中,序列化

这种方法不使用任何与角色管理或授权相关的宝石,比如专家坎坎罗列。如果你对我的方法持怀疑态度,想弄脏你的手,就给你留些链接吧。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33950172

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档