如何在 Clearance 中禁用电子邮件验证
How do disable email validation in Clearance
我正在尝试让 Clearance 将 AWS Dynamo 作为后端存储。我遇到的问题是我无法获得 not 的许可来进行电子邮件唯一性验证,它不能这样做,因为它无法通过以下方式进行标准的 ActiveRecord 唯一性验证SQL 查询。
根据 the comments in the code,我应该能够拥有我的 User
对象 return email_optional?
true
,并且应该禁用唯一性验证电子邮件。所以我有:
class User < ApplicationRecord
include Dynamoid::Document
include Clearance::User
field :name
field :email
def email_optional?
puts 'yes, email is optional'
true
end
end
但是,当我尝试创建用户时出现错误,更重要的是,puts
没有执行:
$ rails c
Running via Spring preloader in process 18665
Loading development environment (Rails 5.1.3)
irb(main):001:0> u = User.new(name: 'ijd', email: 'ian@fu.bar', password: 'test')
ActiveRecord::StatementInvalid: Could not find table 'editor_development_users'
from (irb):1
更新:@spickermann 的回复提醒我,我应该注意到我也尝试过不子类化 ActiveRecord::Base
(通过 ApplicationRecord
)。它给出了不同的错误:
class User
include Dynamoid::Document
....
irb(main):002:0> reload!
Reloading...
=> true
irb(main):003:0> u = User.new(name: 'ijd', email: 'ian@fu.bar', password: 'test')
ArgumentError: Unknown validator: 'UniquenessValidator'
from app/models/user.rb:4:in `include'
from app/models/user.rb:4:in `<class:User>'
from app/models/user.rb:2:in `<top (required)>'
from (irb):3
User.new
不会触发验证。因此错误不能与验证本身相关联。
目前,您的 User
模型兼具两者:ActiveRecord::Base
的子类,并且其行为类似于 Dynamoid::Document
。
class User < ApplicationRecord
include Dynamoid::Document
# ...
end
ActiveRecord::Base
在初始化实例时从数据库中读取 table 定义。这会导致您出现异常,因为 table 不存在。只需删除 ApplicationRecord
.
的继承
class User
include Dynamoid::Document
# ...
end
删除继承时的第二个问题更复杂。通常,当您想要验证不继承自 ActiveRecord::Base
的模型时,我建议仅 include ActiveModel::Validations
。但是 UniquenessValidator
不是在 ActiveModel::Validations
中定义的,而是在 ActiveRecord::Validations
中定义的(这是有道理的)。这使得 Clearance
与不继承自 ActiveRecord::Base
的模型不兼容。
我可能会定义一个 UniquenessValidator
的虚拟实现作为解决方法:
class User
include Dynamoid::Document
class UniquenessValidator
def initialize(_options); end
def def validate_each(_record, _attribute, _value); end
end
# ...
end
我正在尝试让 Clearance 将 AWS Dynamo 作为后端存储。我遇到的问题是我无法获得 not 的许可来进行电子邮件唯一性验证,它不能这样做,因为它无法通过以下方式进行标准的 ActiveRecord 唯一性验证SQL 查询。
根据 the comments in the code,我应该能够拥有我的 User
对象 return email_optional?
true
,并且应该禁用唯一性验证电子邮件。所以我有:
class User < ApplicationRecord
include Dynamoid::Document
include Clearance::User
field :name
field :email
def email_optional?
puts 'yes, email is optional'
true
end
end
但是,当我尝试创建用户时出现错误,更重要的是,puts
没有执行:
$ rails c
Running via Spring preloader in process 18665
Loading development environment (Rails 5.1.3)
irb(main):001:0> u = User.new(name: 'ijd', email: 'ian@fu.bar', password: 'test')
ActiveRecord::StatementInvalid: Could not find table 'editor_development_users'
from (irb):1
更新:@spickermann 的回复提醒我,我应该注意到我也尝试过不子类化 ActiveRecord::Base
(通过 ApplicationRecord
)。它给出了不同的错误:
class User
include Dynamoid::Document
....
irb(main):002:0> reload!
Reloading...
=> true
irb(main):003:0> u = User.new(name: 'ijd', email: 'ian@fu.bar', password: 'test')
ArgumentError: Unknown validator: 'UniquenessValidator'
from app/models/user.rb:4:in `include'
from app/models/user.rb:4:in `<class:User>'
from app/models/user.rb:2:in `<top (required)>'
from (irb):3
User.new
不会触发验证。因此错误不能与验证本身相关联。
目前,您的 User
模型兼具两者:ActiveRecord::Base
的子类,并且其行为类似于 Dynamoid::Document
。
class User < ApplicationRecord
include Dynamoid::Document
# ...
end
ActiveRecord::Base
在初始化实例时从数据库中读取 table 定义。这会导致您出现异常,因为 table 不存在。只需删除 ApplicationRecord
.
class User
include Dynamoid::Document
# ...
end
删除继承时的第二个问题更复杂。通常,当您想要验证不继承自 ActiveRecord::Base
的模型时,我建议仅 include ActiveModel::Validations
。但是 UniquenessValidator
不是在 ActiveModel::Validations
中定义的,而是在 ActiveRecord::Validations
中定义的(这是有道理的)。这使得 Clearance
与不继承自 ActiveRecord::Base
的模型不兼容。
我可能会定义一个 UniquenessValidator
的虚拟实现作为解决方法:
class User
include Dynamoid::Document
class UniquenessValidator
def initialize(_options); end
def def validate_each(_record, _attribute, _value); end
end
# ...
end