1) Вначале добавим колонку phone_number в таблицу users с помощью миграции:
rails g migration AddPhoneNumberToUsers phone_number:string:uniq:index
rake db:migrate2) Внесем следующие изменения в модель (класс User):
- Добавим опцию authentication_keys: [:login] в вызов метода devise:
devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable, :confirmable, authentication_keys: [:login]
- Добавим поле login:
def login=(login) @login = login end def login @login || self.phone_number || self.email end
-
Перегрузим метод отвечающий за поиск модели в базе данных:
def self.find_for_database_authentication(warden_conditions) conditions = warden_conditions.dup if login = conditions.delete(:login) where(conditions.to_h).where(["lower(phone_number) = :value OR lower(email) = :value", { value: login.downcase }]).first else where(conditions.to_h).first end end
before_action :configure_permitted_parameters, if: :devise_controller? protected def configure_permitted_parameters devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:phone_number, :email, :password, :password_confirmation) } devise_parameter_sanitizer.for(:sign_in) { |u| u.permit(:login, :phone_number, :email, :password, :remember_me) } devise_parameter_sanitizer.for(:account_update) { |u| u.permit(:phone_number, :email, :password, :password_confirmation, :current_password) } endЭтот код указыает Devise какие поля формы следует сохранить в моделе. Для понимания этот код был бы аналогичен такому коду в контроллере SessionsController:
def sign_in permit_params = params.required(:user).permit(:phone_number, :email, :password, :password_confirmation) @user.attributes=permit_params end5) Далее нужно внести изменения в представления. По-умолчанию представления берутся из gem'а. Приведенная ниже команда генерирует представляения в вашем проекте. Они перегружают представления из gem'а:
rails generate devise:viewsВ форму регистрации (представление views/devise/registrations/new.html.erb) добавляем поле phone_number. Также вы можете добавить поле phone_number в представление редактирования данных пользователя views/devise/registrations/edit.html.erb. В форме аутентификации(представление views/devise/sessions/new.html.erb) заменяем поле email на поле login.
6) Не уверен обязательно ли это, но в config/initializers/devise.rb
config.authentication_keys = [ :login ]7) Перезапускаем сервер, пробуем.