Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 对验证相同但略有不同的两个字段进行自定义验证_Ruby On Rails - Fatal编程技术网

Ruby on rails 对验证相同但略有不同的两个字段进行自定义验证

Ruby on rails 对验证相同但略有不同的两个字段进行自定义验证,ruby-on-rails,Ruby On Rails,以下是导致代码气味的范围: validates :email, uniqueness: { scope: :client_id }, if: Proc.new {|u| u.active? and !u.email.blank? } validates :companyemail, uniqueness: { scope: :client_id }, if: Proc.new {|u| u.active? and !u.companyemail.blank? } 以下是我尝试过的,但这会导致我

以下是导致代码气味的范围:

validates :email, uniqueness: { scope: :client_id }, if: Proc.new {|u| u.active? and !u.email.blank? }
validates :companyemail, uniqueness: { scope: :client_id }, if: Proc.new {|u| u.active? and !u.companyemail.blank? }
以下是我尝试过的,但这会导致我的测试失败,因为电子邮件字段已被占用:

class EmailValidator < ActiveModel::EachValidator
  def validate_each(record, attribute, value)
    record.errors[attribute] << 'has already been taken' if record.active? and !attribute.blank?
  end
end

validates :email, :companyemail, uniqueness: { scope: :client_id }, email: true
class EmailValidatorrecord.errors[attribute]您可以使用以下命令对这两行进行分组:

例如:

with_options uniqueness: { scope: :client_id }, if: Proc.new { |u| u.active? && u.email } do 
  validates :email
  validates :companyemail
end

当我阅读您的代码时,每次记录处于活动状态且电子邮件地址存在时,该验证器都会失败

您是否看过使用
allow\u blank:true
选项

可能是这样的:

validates :email,: companyemail uniqueness: { scope: :client_id },  if: "record.active?", allow_blank: true

这并不测试是否存在CompanyMail,我需要它来测试电子邮件是否唯一如果电子邮件存在,并且CompanyMail是唯一的如果它存在,那么您可以添加
presence:true
?抱歉,我现在没有完全遵守要求。