唯一性验证器返回未定义的方法"new_record?



我的表单对象在验证唯一性时遇到问题,如果用户名,然后我搜索了有关如何在表单对象中使用唯一性验证的答案,然后我在这个问题中找到了答案

在动态模型对象上,如何检查唯一性?

但不幸的是,在我创建 UniquenessValidator 类后,它在我的表单视图中返回了一个错误,

undefined method `new_record?' for #<UserForm:0x007fd40c42d258>

我该如何解决此错误,我使用的是 Rails 5.1

用户表单 (user_form.rb(:

class UserForm
include Virtus.model
extend ActiveModel::Naming
include ActiveModel::Conversion
include ActiveModel::Validations
attribute :username, String
attribute :password, String
attribute :company_name, String
validates :username, presence: { message: '%{attribute} is required'}
validates :password, presence: { message: '%{attribute} is required'}
validates :company_name, presence: { message: '%{attribute} is required'}
validates :password, length: { minimum: 6, message: '%{attribute} must me
minimum of 6 characters' }
validates :username, uniqueness: { case_sensitive: false, model: User, attribute: :username }
def persisted?
false
end
def save
if valid?
persist!
true
else
false
end
end
private
def persist!
@company = Company.create!(name: company_name)
@company.users.create!(username: username, password: password,
user_type: 'Owner')
end
end

new_record?方法来自ActiveRecord::P ersistence模块。我怀疑你能简单地包含它,因为你的模型不是ActiveRecord::Base的典型子类。

这是一个快速而肮脏的解决方案,可能会满足您的需求:

validates :username, if: :new_username?
# ...
private
def new_username?
User.where(username: username).empty?
end

请注意,这只有在创建新用户时才能正常工作。更新现有用户将始终失败。(根据您发布的代码,看起来这就是您使用此模型的方式。