Это не обязательно должен быть номер телефона, это может быть username или еще что-нибудь. Но в дальнейшем планируется сделать подтверждение по номеру телефона с помощью SMS, по-этому здесь выбран именно номер телефона.
1) Вначале добавим колонку
phone_number в таблицу
users с помощью миграции:
rails g migration AddPhoneNumberToUsers phone_number:string:uniq:index
rake db:migrate
2) Внесем следующие изменения в модель (класс 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
3) Добавим следующий код в контроллер
ApplicationController:
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
end
5) Далее нужно внести изменения в представления. По-умолчанию представления берутся из 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) Перезапускаем сервер, пробуем.