rails 3验证关联属性的唯一性

时间:2013-03-19 09:19:32

标签: ruby-on-rails-3 validation client-side-validation validates-uniqueness-of

我有一个名为Fund的模型和一个名为Company ..的模型,其中基金属于公司。

我在基金表中进行了验证:

validates :name, presence: true, uniqueness: true

使用client_side_validations在服务器端和客户端都可以使用。但我希望我的基金名称在fund.name值和fund.company.name值之间是唯一的。我希望以与client_side_validations一起使用的方式来实现。

建议?

1 个答案:

答案 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帮助很多