Я буквально только что прошел через тот же процесс, и, как и @user2860931, все, что я смог найти, это несколько примеров того, как назначать роли из консоли. Что мне нужно, так это программно гибкий способ того, как пользователь с ролью администратора или пользователь, скажем, с ролью pmo, может назначать эти роли другим.
Немного поэкспериментировав, я решил это для себя. В этом примере я использую Devise для аутентификации и Rolify для ролей.
Я предполагаю, что у вас уже установлен и работает Devise, поэтому у вас есть существующая модель пользователя. Установите Rolify согласно инструкции на странице гема. Я использовал предложенное имя Роль для модели ролей. Так что делайте все, как указано здесь: https://github.com/RolifyCommunity/rolify. Установите GEM, сгенерируйте с помощью роли пользователя. И перенесите миграцию базы данных.
Это эффективно оставит вас с новой таблицей Roles и отношением has_and_belongs_to_many с таблицей Users.
Что касается моей цели, то мне не требуется обычный интерфейс Create Read (show) Update Delete (CRUD) для ролей, я просто создал несколько с помощью seed.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
Теперь, когда вы делаете rake route, вы получите обычные пути для вашего приложения, чтобы заставить контроллер работать. Вот так и в таком порядке:
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 %>
И вот он у вас есть, простой пользовательский интерфейс, в котором перечислены все доступные роли из базы данных и предусмотрены флажки напротив записи пользователя, чтобы включить или отключить такую роль. Как это:
Пример записи пользователя и списка выбора роли
Для меня это тоже было небольшой головной болью, но, надеюсь, это поможет вам улучшить логику и пользовательский опыт.
person
Cyb3rDud3
schedule
05.12.2015