我有一个名为Fund的模型和一个名为Company ..的模型,其中基金属于公司。
我在基金表中进行了验证:
validates :name, presence: true, uniqueness: true
使用client_side_validations在服务器端和客户端都可以使用。但我希望我的基金名称在fund.name值和fund.company.name值之间是唯一的。我希望以与client_side_validations一起使用的方式来实现。
建议?
答案 0 :(得分:1)
结束创建一个非常具体的验证器并将其添加到客户端验证。这是故障
在models / fund.rb中
validates_fund_name_not_company_name :name
config / initializers / validators中的新文件..名为fund_name_not_company_name_validator.rb
class FundNameNotCompanyNameValidator < ActiveModel::EachValidator
def validate_each(record, attr_name, value)
if ::Company.exists?(name: value)
record.errors.add(attr_name, :fund_name_not_company_name, options.merge(:value => value))
end
end
end
# This allows us to assign the validator in the model
module ActiveModel::Validations::HelperMethods
def validates_fund_name_not_company_name(*attr_names)
validates_with FundNameNotCompanyNameValidator, _merge_attributes(attr_names)
end
end
module ClientSideValidations::Middleware
class FundNameNotCompanyName < ClientSideValidations::Middleware::Base
def response
if ::Company.exists?(name: request.params[:name])
self.status = 404
else
self.status = 200
end
super
end
end
end
然后在app / assets / javascripts / rails.validations.custom.js中 clientSideValidations.validators.remote ['fund_name_not_company_name'] = function(element,options){ if($ .ajax({ url:'/ validators / fund_name_not_company_name', data:{name:element.val()}, // async 必须为false async:false })。status == 404){return options.message; } }
This帮助很多