Я буквально только что прошел через тот же процесс, и как @ user2860931 все, что я смог найти несколько примеров о том, как назначать роли из консоли. То, что мне нужно, - это программно гибкий способ использования пользователем роли администратора или пользователя, говорящего, что роль pmo может назначить эти роли другим.
Немного экспериментируя, я решил это для себя. В этом примере я использую Devise для аутентификации и Rolify для ролей.
Предполагаю, что у вас уже установлено и работает Devise, поэтому у вас есть существующая модель пользователя. Установите Rolify в соответствии с инструкцией на странице gem. Я использовал предложенное имя Роль для модели ролей. Так что сделайте все, как указано здесь: https://github.com/RolifyCommunity/rolify. Установите GEM, сгенерируйте, используя роль Роль пользователя. И перенести миграцию базы данных.
Это эффективно предоставит вам новую таблицу Роли и отношения has_and_belongs_to_many с таблицей Users.
Что касается моей цели, я не нуждаюсь в обычном интерфейсе Create Read (show) Update Delete (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}"
Я оставил свой дополнительный комментарий в, как я с материалом разработки, так что я могу видеть, на первый взгляд он работал отлично. Поэтому, когда вы запускаете
грабли БД: семян
Вы будете иметь несколько ролей настройки. В качестве альтернативы вы можете создать контроллер роли и представления обычным способом, чтобы позволить пользователям с ролью администратора добавлять новые роли.
Теперь забавный бит может начаться. Пока что 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
Теперь вы должны определить маршруты для них таким образом, чтобы они не вступали в противоречие с маршрутами DEViSE. Я сохранил это на данный момент и получил все обычные маршруты для упрощения вашего приложения, которое вы, возможно, захотите изменить, и разрешаете маршруты только тем, которые у вас есть на самом деле.
routes.rb
Rails.appliction.routes.draw do
devise_for :users
root 'pages#home'
resources :users #must be after devise
end
Когда вы сейчас совершаете маршруты рейка, вы получите обычные пути для вашего приложения, чтобы заставить контроллер работать. Как это и в таком порядке:
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, но я уверен, что вы можете сделать это по своему вкусу.
Чтобы показать существующих пользователей и выбрать их список, создайте index.html.erb в папке/app/views/users. Создайте простой 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 %>
И там у вас есть, простой пользовательский интерфейс, в котором перечислены все доступные роли из базы данных и обеспечивает тикать коробки с записью пользователя, чтобы включить или отключить такую роль. Как это:
Example of user record and role pick list
Это была маленькая голова скребок для меня, как хорошо, но, надеюсь, это будет разместить на вашем пути повышения логики и пользовательского опыта.
Привет, так как мне настроить набор ролей, которые могут быть назначены в моем приложении? Есть ли какой-нибудь справочник о том, как это сделать? Роли назначаются пользователям некоторыми другими приложениями (у которых есть права доступа к блогам для их назначения). Администраторы создают роли и делегируют полномочия назначения). Я пытаюсь понять, как создавать роли. Документация gem показывает, как это сделать в консоли, но я хочу, чтобы они были доступны в моем приложении. Я не могу понять, как это сделать. – Mel
Используйте миграцию данных (data) для создания ролей. Эти миграции будут записаны в рубине и будут заполнять роли в базе данных. – lorefnon
Вы хотите сделать таблицу в db для ролей и иметь роли в качестве логических атрибутов? – Mel