Гем Devise. Добавление кастомных полей

По умолчанию в модели пользователя гема devise из видимых на портале опознавательных знаков имеется только адрес электронной почты. Посмотрим как можно добавить другие кастомные поля:
  • поле “Имя” (обязательное при регистрации)
  • поле “моб. тел” (необязательное)
  • скрытое поле “workgroup” для различения прав текущего пользователя

Так как фреймворк Ruby on Rails (RoR) работает по системе Model-View-Controller, то, соответственно, изменения нужно внести в каждую составляющую системы аутентификации.

Model

Модель - это представление сущности (юзера) в базе данных (БД) - совокупность названий и правил заполнения столбцов таблицы Users


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

rails g migration AddNamePhoneWorkgroupToUsers


Изменим шаблон

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


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

rails db:migrate


И напоследок в файле модели пропишем валидацию - поле “Имя” не должно быть пустым

app/models/user.rb

validates :name, presence: true, uniqueness: true

На этом работа с моделью закончена, переходим к настройке представления (view) и контроллера.

Controller

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

rails generate devise:controllers users


Дополняем файл роутов согласно подсказке (указываются те контроллеры, в которых будут изменения) для перенаправления обработчика с директории гема в папку проекта

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

View

Необходимо скопировать “вьюху” измененного контроллера из app/views/devise/registrations в app/views/users/registrations

cp -R app/views/devise app/views/users

Идем в директорию 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 “Является обязательным при регистрации”


На странице редактирования профиля также все поля отображены корректно:



О самом важном


Было бы нелогично позволять юзеру выбирать рабочую группу (в т.ч. группу Администраторы) при регистрации. Так что пользователь регистрируется, а затем админ (кто уполномочен) записывает юзера в определенную группу (предоставляет права). НО как появится первый админ?

Открываем консоль “Рельсов” находясь в папке проекта

rails c

Допустим на данный момент в базе всего один юзер. Присвоим ему группу вручную

admin = User.first
admin.workgroup = 'administrators'
admin.save


Готово! В нашем проекте появился царь и бог админ. Портал приобрел более дружественный интерфейс благодаря добавлению кастомного валидируемого поля в модель User.


Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.