Devise 正在用空 UID 保存用户
Devise is saving user with empty UID
运行 下面的语句,期望用相同的电子邮件和 UID 保存用户:email == uid
:
当前行为
user = User.create(email: 'myemail@gmail.com', password: '1' * 8, password_confirmation: '1' * 8)
user.email # 'myemail@gmail.com'
user.uid # nil
异常行为
user = User.create(email: 'myemail@gmail.com', password: '1' * 8, password_confirmation: '1' * 8)
user.email # 'myemail@gmail.com'
user.uid # 'myemail@gmail.com'
我的用户模型有什么问题?我记得,当我创建一个新用户时,该设备会自动用电子邮件填充用户的 uid。
我已经在下面粘贴了用户模型代码,以帮助跟踪任何奇怪的代码。
环境
- Ruby 2.4.1
- Rails 5.2.3
- 设计 4.7.1
用户模型
# frozen_string_literal: true
class User < ApplicationRecord # :nodoc:
attr_accessor :skip_password_validation
self.table_name = 'users'
include Status
enum role: Role.to_enum
# Include default devise modules.
devise :company_authenticatable, :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable,
:confirmable, :timeoutable
belongs_to :person, class_name: 'Pessoa'
accepts_nested_attributes_for :person
belongs_to :company, class_name: 'Empresa'
has_many :permissions,
class_name: 'UserPermission',
dependent: :delete_all,
foreign_key: 'user_id'
accepts_nested_attributes_for :permissions
validates_associated :permissions
before_validation :load_predefined_permissions
# validations
validates :permissions, presence: true, if: -> { role.to_s == 'custom' }
validates_presence_of :role, :person
def timeout_in
15.minutes
end
def active_for_authentication?
super && account_active?
end
def account_active?
manager? || (ativo? && permissions.count.positive?)
end
def skip_password_validation?
['true', true, 1, '1'].include?(skip_password_validation)
end
def permission?(subject_class, action)
permissions.any? { |permission| permission.subject_class == subject_class && permission.action == action }
end
def cached_permissions
Rails.cache.fetch("#{cache_key_with_version}/permissions") do
permissions
end
end
def clear_cached_data
Rails.cache.delete("#{cache_key_with_version}/permissions")
end
protected
def password_required?
return false if skip_password_validation?
super
end
private
def load_predefined_permissions
return if role.to_s == 'custom' || manager? || (!role_changed? && !permissions.empty?)
self.permissions = UserPermission.initialize_by_user(self)
end
end
解决它,包括 User
模型中的 DeviseTokenAuth::Concerns::User
问题。
¯_(⊙︿⊙)_/¯
运行 下面的语句,期望用相同的电子邮件和 UID 保存用户:email == uid
:
当前行为
user = User.create(email: 'myemail@gmail.com', password: '1' * 8, password_confirmation: '1' * 8)
user.email # 'myemail@gmail.com'
user.uid # nil
异常行为
user = User.create(email: 'myemail@gmail.com', password: '1' * 8, password_confirmation: '1' * 8)
user.email # 'myemail@gmail.com'
user.uid # 'myemail@gmail.com'
我的用户模型有什么问题?我记得,当我创建一个新用户时,该设备会自动用电子邮件填充用户的 uid。 我已经在下面粘贴了用户模型代码,以帮助跟踪任何奇怪的代码。
环境
- Ruby 2.4.1
- Rails 5.2.3
- 设计 4.7.1
用户模型
# frozen_string_literal: true
class User < ApplicationRecord # :nodoc:
attr_accessor :skip_password_validation
self.table_name = 'users'
include Status
enum role: Role.to_enum
# Include default devise modules.
devise :company_authenticatable, :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable,
:confirmable, :timeoutable
belongs_to :person, class_name: 'Pessoa'
accepts_nested_attributes_for :person
belongs_to :company, class_name: 'Empresa'
has_many :permissions,
class_name: 'UserPermission',
dependent: :delete_all,
foreign_key: 'user_id'
accepts_nested_attributes_for :permissions
validates_associated :permissions
before_validation :load_predefined_permissions
# validations
validates :permissions, presence: true, if: -> { role.to_s == 'custom' }
validates_presence_of :role, :person
def timeout_in
15.minutes
end
def active_for_authentication?
super && account_active?
end
def account_active?
manager? || (ativo? && permissions.count.positive?)
end
def skip_password_validation?
['true', true, 1, '1'].include?(skip_password_validation)
end
def permission?(subject_class, action)
permissions.any? { |permission| permission.subject_class == subject_class && permission.action == action }
end
def cached_permissions
Rails.cache.fetch("#{cache_key_with_version}/permissions") do
permissions
end
end
def clear_cached_data
Rails.cache.delete("#{cache_key_with_version}/permissions")
end
protected
def password_required?
return false if skip_password_validation?
super
end
private
def load_predefined_permissions
return if role.to_s == 'custom' || manager? || (!role_changed? && !permissions.empty?)
self.permissions = UserPermission.initialize_by_user(self)
end
end
解决它,包括 User
模型中的 DeviseTokenAuth::Concerns::User
问题。
¯_(⊙︿⊙)_/¯