Я смог разрешить пользователям входить в систему либо под своим именем пользователя, либо по электронной почте, применив этот бит кода в проблемах моей модели.
module ClassMethods
def authenticate(username, email, password)
user = User.find_by(username: username)
user_email = User.find_by(email: email)
return unless user || user_email
if user
user.send :new_token
user.authenticate password
elsif user_email
user_email.send :new_token
user_email.authenticate password
end
end
end
included do
has_secure_password
before_create :set_token
after_find :fix_up_token
validates :email, uniqueness: true
validates :email, presence: true
validates :username, uniqueness: true
validates :username, presence: true
validates :password_confirmation, presence: true, on: :create
end
Я изначально пытался создать условие для пользователя 'с методом find_by, но мне не повезло. Я закончил с идеей создания 'user_email' как обходного пути, и это работает, но я чувствую, что должен быть способ сделать это с одной переменной.
Обновление
Я смог заставить его работать с двумя ответами ниже.
Этот здесь от max :
def authenticate(username, email, password)
user = User.where(email: email)
.or(User.where(username: username)).take
return unless user
user.send :new_token
user.authenticate password
end
И этот здесь от Саджад Умар :
def authenticate(username, email, password)
user = User.find_by(username: username) || User.find_by(email: email)
return if user.blank?
user.send :new_token
user.authenticate password
end
Обновление 2
Шон рекомендуется использовать регулярное выражение для сканирования ввода для электронной почты формат. У меня уже есть требование к формату электронной почты, но я хотел убедиться, что пользователь не может создать имя пользователя, совпадающее с адресом электронной почты другого пользователя. Итак, я установил валидацию формата для имени пользователя с помощью регулярных выражений.
included do
has_secure_password
before_create :set_token
after_find :fix_up_token
validates :email, uniqueness: true
validates :email, presence: true
validates :username, uniqueness: true
validates :username, presence: true
validates :username, format: { with: /\A[a-zA-Z0-9]+\z/,
message: 'only allows letters and numbers' }
validates :password_confirmation, presence: true, on: :create
end
Спасибо всем за помощь!