Rails自定义客户端验证

时间:2015-11-06 15:50:09

标签: ruby-on-rails ruby simple-form client-side client-side-validation

我的自定义验证在客户端无效。谁能明白为什么? 未调用validate_each。它直接在模型中获取named_regexp的错误消息。

// app/validators/named_regexp_validator.rb

class NamedRegexpValidator < ActiveModel::EachValidator
  ERROR_MESSAGE = "Regexp group names are required"

  def check_validity!
    unless valid_groups && valid_groups.kind_of?(Array) && valid_groups.any?
      raise ArgumentError, ERROR_MESSAGE
    end
  end

  def validate_each(record, attribute, value)
    if value.present?
      regexp = Regexp.new value, false

      if regexp.names.none?
        record.errors.add attribute, :blank_regexp_group
      else
        extra_groups = regexp.names - valid_groups

        if extra_groups.any?
          record.errors.add attribute, :named_regexp, allowed: valid_groups.join(', '), extra: extra_groups.join(', ')
        end
      end
    end
  end

  private

  def valid_groups
    options[:groups]
  end
end

在模型中,我的验证如下:

validates :regexp_string, named_regexp: { groups: %w(name surname) }

在haml视图中,它是一个简单的输入

= f.input :regexp_string, as: :string

我正在使用:

gem 'nested_form'
gem 'simple_form'
gem 'client_side_validations', github: 'DavyJonesLocker/client_side_validations'
gem 'client_side_validations-simple_form', github: 'DavyJonesLocker/client_side_validations-simple_form'

当我按下提交按钮并且我有一个糟糕的正则表达式验证不会通过错误。 如果选择了其他表单选项,我也无法在js的regexp字段中添加状态验证。我添加了requred:true但仍然没有,我该怎么强迫呢?

||编辑:

我发现有一种方法可以通过以下方式添加这些客户端验证:

ClientSideValidations.validators.local["named_regexp"] = function(element, options) {
  var s = element.val();

  if (ADD_ALL_VALIDATIONS_HERE) {
    return options.message;
  }
}

但它太复杂了,我无法相信没有更简单的方法。或者有人知道吗?

0 个答案:

没有答案