0

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

我的基金表中有此验证:

validates :name, presence: true, uniqueness: true

这适用于使用client_side_validations的服务器端和客户端。但我希望我的基金名称在 fund.name 值和 fund.company.name 值中都是唯一的。而且我想以一种可以与client_side_validations一起使用的方式来做到这一点。

建议?

4

1 回答 1

1

最终创建了一个非常具体的验证器并将其添加到客户端验证中。这是故障

在模型/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; } }

帮助很大

于 2013-03-19T21:18:01.723 回答