我正在尝试用Rails 4制作一个应用程序。
我正在研究角色管理,并希望使用Rolify,因为它支持实例级的角色分配。
对于其他人来看同样的问题,下面有两个非常好的答案(我只能勾选一个,但我使用了两者)。请查看下面的lorefnon & Cyb3rDud3答案)。我仍然在计算它,但已经使用数组(如lorefnon显示)和控制器/路由函数(如Cyb3rDud3所示)进行了迁移。
让我完全困惑的是,Rolify宝石的所有文档都使用控制台来定义角色。
如何在代码中定义角色?
董事会中的其他成员也提出了一些问题,这些问题暗示着他们在db:种子文件中定义了角色。我不想这么做,因为我想控制谁比谁更能使用我的种子文件来创建角色。
你在哪里做的?
所有的例子都显示它是从控制台完成的。我想要定义一个角色列表,然后我想给角色权限(我想使用这一部分的专家)。
我有一个用户模型。我看到的另一个宝石是榜样。它要求您在用户模型中创建一个角色数组。很明显,你应该在Rolify中这样做--没有一个文档给你这一步?
你在哪里定义角色?
发布于 2015-12-02 09:33:43
让我完全困惑的是,Rolify宝石的所有文档都使用控制台来定义角色。
Rolify文档不使用控制台来定义角色--它演示了如何在纯ruby中添加角色。这是非常强大的,因为您可以在任何地方定义角色,只要您可以运行ruby。您不限于在某些配置文件或某些数据库表中定义的静态角色列表。
您需要问的第一个问题是角色是什么时候创建的?
最常见的用例分为两类:
1.角色是静态的.
角色由应用程序开发人员、支持人员或公司管理人员在应用程序安装/部署期间创建一次,在运行应用程序期间,这些预先创建的角色被分配给不同的用户。
这类角色最常见的用例包括对公司中的人员(开发人员、经理、支持等)进行建模,或者对预先已知的职责(编辑、管理员、查看器等)进行建模。
如果您的角色确实属于这样的用例,那么下一步您必须决定--创建和修改角色是谁的责任。通常有两种可能性:
1.1.应用程序开发人员本身就是必须添加/删除/修改角色的人。在这种情况下,最好依靠种子数据或Rails迁移。
迁移的优点是,如果需要,可以轻松地回滚数据。这种迁移是由rolify生成器生成的迁移的补充,rolify生成器为您创建了与角色相关的表模式(参见下面的图表)。
这样的迁移看起来可能是:
db/migrate/20151204083556_create_application_roles.rb
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_role或remove_role方法通过rolify.This提供的用户操作或应用程序事件将发生在运行应用程序的生命周期中,而不是在应用程序安装过程中。
1.2添加/删除/修改角色的任务由支持团队或技术主管完成。在这种情况下,需要提供一个管理角色的管理接口。
在这种情况下,您将有一个rails控制器来管理角色。创建操作将用于创建角色,显示操作将显示角色等。这些操作将具有附带的视图,这些视图将为最终用户提供图形用户界面来管理角色。
2.角色是动态的
这个类别涵盖了角色更像类别或标签,并且可以由最终用户创建/修改/删除的用例。例如,图书管理员可以将某些角色/类别分配给特定类型的书籍。
这种情况类似于1.2,因为您必须通过rails控制器处理创建/删除/更新角色。
下一部分是如何在表中构造信息。
Rolify期望有一个特定的模式(在一定程度上是可定制的),但是预期的模式足够灵活,可以处理上述所有用例。

发布于 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创建了一些这样的界面。
#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已经完成了所有关于用户的操作,或者您可能已经完成了自己的控制器,但是您需要创建自己的用户控制器和视图。因为我只想要一个针对每个用户的角色的勾选框列表,我这样做了如下。这是我的
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现在,您必须定义这些路径,这样它们就不会与设计路线发生冲突。我一直保持它简单,目前和资源,所有通常的路线,以加强您的应用程序,您可能想要改变,并只允许那些路线,你实际拥有。
routes.rb
Rails.appliction.routes.draw do
devise_for :users
root 'pages#home'
resources :users #must be after devise
end当您现在执行rake路由时,您将得到应用程序使控制器工作的常用路径。就像这样,按照顺序:
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和一个编辑,您可以在其中分配和删除现有角色。就像这样。
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 %>这里有一个简单的用户界面,它列出了数据库中的所有可用角色,并提供了针对用户记录的勾选框,以启用或禁用该角色。如下所示:
用户记录和角色选择列表示例
这对我来说也是个小麻烦,但希望这能让你在增加逻辑和用户体验的过程中有所收获。
发布于 2015-11-30 12:31:15
在阅读了项目页面中的文档和示例之后,我决定不使用gem来管理页面中的角色,因为我认为配置和使用需要花费很多时间。因此,我做了以下工作(我相信您在用户模型中使用了devise,尽管它不是强制性的):
如果您想要定义某些角色,并且“静态”不可修改,但可以从页面中指定,请参见下面的,如果不跳到下一个粗体行
role: integer的字段添加到User模型中。(我们使用整数,因为这个值将与我们在下一步定义的枚举中的一个条目相关联)user.rb (模型)中,添加一个enum,如下所示:
类用户 :new_record?def set_default_role self.role ||=:正常端def中,您只需获得当前用户或您想要分配角色的任何用户,并且只需执行以下一行的简单操作:
#让我们假设我们想让当前用户current_user.premium!#或其他人成为管理用户= User.first user.admin!如果要在页面中添加、修改和删除角色,并在其中分配角色,则为
首先,在直接从页面分配角色时要小心。这里的问题是,每个人都可以给自己指定自己在某一领域中所选择的角色。但是,如果这是你所需要的,请按以下步骤操作:
Role创建一个名为role: string的模型roles_controller.rbrole_ids: text (它的文本,因为您需要在那里保存多个角色,所有角色都封装在一个数组中),这将代表他的角色。在您的user.rb模型中,您可以有一个get_roles和其他def方法,以便在控制器和视图中有更清晰的代码:
类用户def实现控制器。你可以看看如何将数组保存在数据库中,序列化
这种方法不使用任何与角色管理或授权相关的宝石,比如专家、坎坎、罗列。如果你对我的方法持怀疑态度,想弄脏你的手,就给你留些链接吧。
https://stackoverflow.com/questions/33950172
复制相似问题