0

我有一个名为基金的模型和一个名为Company的模型..其中基金属于公司。rails 3验证关于一个协会的属性的唯一性

我有这个验证我的基金表:

validates :name, presence: true, uniqueness: true 

这适用于服务器端和客户端使用client_side_validations。但我希望我的基金名称在fund.name值和fund.company.name值中唯一。我想以一种可以与client_side_validations一起工作的方式来完成。

对此提出建议?

回答

1

结束创建一个非常具体的验证器并将其添加到客户端验证。 Here'z在配置/初始化/验证击穿

在模型/ fund.rb

validates_fund_name_not_company_name :name 

新的文件名为.. 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 /资产/ JavaScript的/rails.validations.custom.js clientSideValidations.validators.remote ['fund_name_not_company_name'] = function(element,options)if($ .ajax({/ validators/fund_name_not_company _name', data:{name:element.val()}, // async must be false async:false })。status == 404){return options.message; }}

This了大量帮助

+0

的感谢!你的文章帮了我很多! – alt 2013-05-23 10:26:35