设计使用电子邮件或手机号码注册用户

时间:2017-06-16 16:19:27

标签: ruby-on-rails ruby-on-rails-4 devise

我按照这篇文章通过电子邮件或用户名实现用户注册。 https://github.com/plataformatec/devise/wiki/How-To:-Allow-users-to-sign-in-using-their-username-or-email-address

User.rb


devise :database_authenticatable, :registerable,
     :recoverable, :rememberable, :trackable, :validatable, authentication_keys: [:login]
attr_accessor :login

def login=(login)
  @login = login
end

def login
 @login || self.contact_no || self.email
end

def self.find_for_database_authentication(warden_conditions)
 conditions = warden_conditions.dup
 if login = conditions.delete(:login)
  where(conditions.to_hash).where(["lower(contact_no) = :value OR lower(email) = :value", { :value => login.downcase }]).first
 elsif conditions.has_key?(:contact_no) || conditions.has_key?(:email)
  where(conditions.to_hash).first
 end
end

Devise.rb

config.authentication_keys = [ :login ]

但仍然收到错误'电子邮件不能为空白'。我怎样才能解决这个问题?我哪里出错?

2 个答案:

答案 0 :(得分:1)

我的项目中也需要相同的功能。

您不必执行那么多代码。

User.rb

def self.find_for_database_authentication(conditions={})
    find_by(contact_number: conditions[:email]) || find_by(email: conditions[:email])
end

sessions / new.html.erb

<%= f.text_field :email %>

注意:您在数据库中的contact_number和电子邮件(字段)应为uniq

答案 1 :(得分:0)

您正在关注登录文章以解决注册问题。很简单,您需要找到验证的来源。这是file

现在要解决您的问题,您需要在使用设计的模型中覆盖email_required?方法。仅在contact_no为空白或您想要的任何条件时检查所需的电子邮件。

class User < ApplicationRecord

  def email_required?
    self.contact_no.blank? #If contact number blank then email required.
  end

end