0

私はFundというモデルとCompanyというモデルを持っています。ここで、Fundは会社に属しています。

私は自分のファンドテーブルにこの検証を持っています:

validates :name, presence: true, uniqueness: true

これは、 client_side_validationsを使用して、サーバー側とクライアント側の両方で機能します。ただし、ファンド名は、fund.name値とfund.company.name値の両方で一意である必要があります。そして、 client_side_validationsでも機能する方法でそれを実行したいと思います。

提案?

4

1 に答える 1

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; } }

これは大いに役立ちました

于 2013-03-19T21:18:01.723 に答える