我正在使用devise-auth-token,并希望使用除电子邮件之外的字段登录。 所以我使用phone_number代替,一切正常,但我无法删除电子邮件验证,这是我的代码
user.rb
class User < ActiveRecord::Base
include DeviseTokenAuth::Concerns::User
devise :database_authenticatable, :confirmable, authentication_keys: [:phone_number]
mount_uploader :avatar, AvatarUploader
validates :first_name, presence: true,format: {with: /[[:word:]]/}
validates :last_name , presence: true,format: {with: /[[:word:]]/}
validates :email , format: { with: /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i, on: :create }, uniqueness: true
validates :phone_number, presence: true, uniqueness: true
validate :birthdate_in_the_future_invalid
validates :country_code, presence: true
validates :birthdate, presence: true
validates :gender, presence: true
# validates :file, presence: true
validates :phone_number, phone: { possible: true, types: [:mobile], country_specifier: -> phone { phone.country_code.try(:upcase) } }
validate :e164_phone_number
after_create :set_provider_uid
def email_required?
false
end
def email_changed?
false
end
def password_required?
super if confirmed?
end
def password_match(password, password_confirmation)
self.errors[:password] << "can't be blank" if password.blank?
self.errors[:password_confirmation] << "can't be blank" if password_confirmation.blank?
self.errors[:password_confirmation] << "does not match password" if password != password_confirmation
password == password_confirmation && !password.blank?
end
private
def birthdate_in_the_future_invalid
begin
if Date.strptime(birthdate, '%d-%m-%Y') > Date.today
errors.add(:birthdate, "in_the_future")
end
rescue
errors.add(:birthdate, "invalid format")
end
end
def e164_phone_number
if phone_number[0] != '+'
errors.add(:phone_number, "invalid format")
end
end
def set_provider_uid
self.update_column(:uid, phone_number)
self.update_column(:provider, "phone_number")
end
end
这是我的初始值设定项/ devise.rb
Devise.setup do |config|
config.mailer_sender = 'aliabdelrahmanweka74@gmail.com'
require 'devise/orm/active_record'
config.authentication_keys = [:phone_number]
config.case_insensitive_keys = [:phone_number]
config.strip_whitespace_keys = [:phone_number]
config.skip_session_storage = [:http_auth]
config.stretches = Rails.env.test? ? 1 : 11
config.reconfirmable = false
config.expire_all_remember_me_on_sign_out = true
config.password_length = 6..128
config.email_regexp = /\A[^@\s]+@[^@\s]+\z/
config.reset_password_within = 6.hours
config.sign_out_via = :delete
end
我用了funciton email_required?并使其返回false但没有任何反应
我调用localhost:3000 / users,Method Post 参数:
{
"user": {
"first_name": "ali",
"last_name": "weka",
"gender": "male",
"birthdate": "25-06-2016",
"email": "",
"phone_number": "+201118574649",
"country_code": "EG",
"uid": "+201118574649",
"provider": "phone_number"
}
}
这是响应
{"status":"error","data":{"id":null,"first_name":"ali","last_name":"ali","country_code":"EG","phone_number":"+201119574649","gender":"male","birthdate":"25-06-2016","created_at":null,"updated_at":null,"provider":"email","uid":"+201119574649","avatar":{"url":null},"email":""},"errors":{"email":["can't be blank","is invalid"],"full_messages":["Email can't be blank","Email is invalid"]}}
所以请帮忙吗?
答案 0 :(得分:1)
我有同样的问题。我希望一些用户使用电子邮件,而有些用户则不需要。
您首先应通过迁移从用户表中删除null:false限制。如果要删除默认的“”,请执行此操作。不要删除索引,因此它仍然可以验证电子邮件的唯一性(以防您有时仍使用电子邮件)。空值不会对唯一约束造成任何问题。
如果您使用的是可验证的设备,请在用户模型中添加此方法:
def email_required?
false
end
完成上一部分之后,您应该执行以下操作之一:
选项1 : 深入研究devise_token_auth gem,至少在我看来,我意识到其中包含了this concern。
默认情况下已包含它,除非您使用以下方式修改DeviseTokenAuth初始化程序
config.default_callbacks = false
但是也许你不想要那个。
选项2 : 如果您检查了我链接的关注点中的代码,则可以看到它可以验证电子邮件,以防万一 user 的 provider 是'email'。
我的解决方法是将没有电子邮件的用户的 provider 字段更改为其他内容。 进行这两项更改后,您的电子邮件将不再有效。
对于某些有时需要电子邮件的人:
,您可以在User模型中使用以下方法:
def email_required?
true unless phone_number?
end