我刚刚经历了同样的过程,并且像@user2860931一样,我只能找到一些控制台中如何分配角色的示例。我需要的是以编程方式将具有管理员角色或PMO角色的用户分配这些角色给他人的灵活方法。
通过一些实验,这就是我为自己解决问题的方法。在此示例中,我正在使用Devise进行身份验证,并使用Rolify进行角色管理。
假设您已经安装并使用了Devise,因此您已经拥有现有的用户模型。按照宝石页面上的指示安装Rolify。我使用Role作为角色模型的名称。因此,请按照此处指定的所有步骤操作:https://github.com/RolifyCommunity/rolify。安装宝石,使用rolify生成Role User。然后迁移数据库迁移。
这将有效地使您拥有一个新表Roles,并带有与Users表的has_and_belongs_to_many关系。
对于我的目的,我不需要通常的Create Read(show)Update Delete(CRUD)接口来管理角色,我只是通过seeds.rb创建了一些角色,如下所示。
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:seed
时,你会设置一些角色。 或者,您可以像通常那样创建控制器和视图来允许具有管理员角色的用户添加新角色。
现在就开始吧。到目前为止,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)
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
现在你需要定义这些路由,以便它们不会与Devise的路由冲突。我目前将其简化并将所有常规路由资源化,为了使您的应用程序更加安全,您可能需要更改它,并仅允许实际拥有的路由。
routes.rb
Rails.appliction.routes.draw do
devise_for :users
root 'pages#home'
resources :users
end
当你现在运行 rake routes 命令时,会得到应用程序所需的常规路径,以使控制器正常工作。如下所示,并依照该顺序排列:
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/views/users文件夹中创建index.html.erb。创建一个简单的show.html.erb和一个edit,在其中可以分配和删除现有角色。就像这样。
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 %>
这里有一个简单的用户界面,它列出了数据库中所有可用的角色,并在用户记录旁提供复选框,以启用或禁用此类角色。就像这样:
用户记录和角色选择列表示例
这对我来说也是一个小难题,但希望这能帮助您增加逻辑和用户体验。