Гем Devise. Добавление кастомных полей
По умолчанию в модели пользователя гема devise из видимых на портале опознавательных знаков имеется только адрес электронной почты. Посмотрим как можно добавить другие кастомные поля:
Так как фреймворк Ruby on Rails (RoR) работает по системе Model-View-Controller, то, соответственно, изменения нужно внести в каждую составляющую системы аутентификации.

Итак, нам нужно добавить 3 столбца: ‘name’,’phone’ и ‘workgroup’, и все они по сути будут строкового типа (string). Изменения в БД в RoR вносятся с помощью миграций - это текстовые файлы, находящиеся в директории db/migrate и описывающие необходимые изменения. Шаблон новой миграции создается генератором “Рельсов” (при этом название пишется в КэмелКейсе и содержит смысл содержания миграции):

Изменим шаблон
class AddNamePhoneWorkgroupToUsers < ActiveRecord::Migration[5.1]
def change
add_column :users, :name, :string, null: false, default: ""
add_column :users, :phone, :string
add_column :users, :workgroup, :string
add_index :users, :name, unique: true
end
end

и применим миграцию

И напоследок в файле модели пропишем валидацию - поле “Имя” не должно быть пустым
app/models/user.rb
validates :name, presence: true, uniqueness: true
На этом работа с моделью закончена, переходим к настройке представления (view) и контроллера.

Дополняем файл роутов согласно подсказке (указываются те контроллеры, в которых будут изменения) для перенаправления обработчика с директории гема в папку проекта
devise_for :users, controllers: { registrations: 'users/registrations' }
Открываем файл app/controllers/users/registrations_controller.rb
Раскомментируем обе первые строки колбэков

Раскомментируем раздел protected и укажем созданные поля модели
protected
# If you have extra params to permit, append them to the sanitizer.
def configure_sign_up_params
devise_parameter_sanitizer.permit(:sign_up, keys: [:name, :phone, :workgroup])
params.require(:user).permit(:name, :email, :password, :password_confirmation, :phone)
end
# If you have extra params to permit, append them to the sanitizer.
def configure_account_update_params
devise_parameter_sanitizer.permit(:account_update, keys: [:name, :phone, :workgroup])
end
Идем в директорию app/views/users/registrations и добавляем поля в HTML-код страниц регистрации
<div class="field">
<%= f.label :name %><br />
<%= f.text_field :name, autofocus: true %>
</div>
<div class="field">
<%= f.label :email %><br />
<%= f.email_field :email %>
</div>
<div class="field">
<%= f.label :phone %><br />
<%= f.text_field :phone %>
</div>

и редактирования профиля

Остается крошечное изменение в коде главной страницы, чтоб в приветствии содержалось имя, а не емейл как раньше
<span>Здравствуйте, <%= current_user.name %></span>

Запускаем сервер

Видим, что в форме добавленные поля присутствуют, а также поле Name “Является обязательным при регистрации”
На странице редактирования профиля также все поля отображены корректно:

Было бы нелогично позволять юзеру выбирать рабочую группу (в т.ч. группу Администраторы) при регистрации. Так что пользователь регистрируется, а затем админ (кто уполномочен) записывает юзера в определенную группу (предоставляет права). НО как появится первый админ?
Открываем консоль “Рельсов” находясь в папке проекта
Допустим на данный момент в базе всего один юзер. Присвоим ему группу вручную
$ admin = User.first
$ admin.workgroup = 'administrators'
$ admin.save

Готово! В нашем проекте появился царь и бог админ. Портал приобрел более дружественный интерфейс благодаря добавлению кастомного валидируемого поля в модель User.
- поле “Имя” (обязательное при регистрации)
- поле “моб. тел” (необязательное)
- скрытое поле “workgroup” для различения прав текущего пользователя
Model
Модель - это представление сущности (юзера) в базе данных (БД) - совокупность названий и правил заполнения столбцов таблицы Users
rails g migration AddNamePhoneWorkgroupToUsers

Изменим шаблон
def change
add_column :users, :name, :string, null: false, default: ""
add_column :users, :phone, :string
add_column :users, :workgroup, :string
end
end

rails db:migrate


Controller
В данный момент работает стандартный контроллер, находящийся в папке с гемом (~/.rvm/gems/ruby-2.4.1@rails5.1.3 $ ). Для его кастомизации генерируем подкласс в директории проектаrails generate devise:controllers users

Раскомментируем обе первые строки колбэков

def configure_sign_up_params
devise_parameter_sanitizer.permit(:sign_up, keys: [:name, :phone, :workgroup])
params.require(:user).permit(:name, :email, :password, :password_confirmation, :phone)
end
def configure_account_update_params
devise_parameter_sanitizer.permit(:account_update, keys: [:name, :phone, :workgroup])
end
View
Необходимо скопировать “вьюху” измененного контроллера из app/views/devise/registrations в app/views/users/registrationscp -R app/views/devise app/views/users
<%= f.label :name %><br />
<%= f.text_field :name, autofocus: true %>
</div>
<%= f.label :email %><br />
<%= f.email_field :email %>
</div>
<%= f.label :phone %><br />
<%= f.text_field :phone %>
</div>





О самом важном
rails c
$ admin.workgroup = 'administrators'
$ admin.save
