获取自定义验证程序以使用client_side_validations gem

时间:2011-05-16 23:36:38

标签: ruby-on-rails-3 validation client-side

我已经编写了一个自定义验证器,并且正在寻找使用client_side_validations gem工作的方法。现在它仍然允许我提交我的表单,然后我得到一个错误框和错误消息。我想知道是否有办法修改gem或我需要如何格式化验证。

以下是我询问如何设置验证的最后一个问题:Writing custom validator in Rails 3

最好的方法是用正则表达式来表达最大字数吗?

3 个答案:

答案 0 :(得分:2)

维基有关于如何编写自定义验证器的非常详细的信息:https://github.com/bcardarella/client_side_validations/wiki/Custom-Validators

您需要按照wiki上的指南来了解如何编写Rails验证程序,使其与ClientSideValidations gem一起使用。例如,如果我在你的另一篇文章中使用验证器,我会这样写:

class WordLimitValidator < ActiveModel::EachValidator
  def validate_each(object, attribute, value)
    unless value =~ /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i
      object.errors.add(attribute, :word_limit, options.merge(:value => value))
    end
  end
end

然后,您需要将:word_limit的错误消息添加到您的en.yml文件中:

# config/locales/en.yml
en:
  errors:
    messages:
      word_limit: "is not formatted properly"

最后,您需要为Javascript添加验证器。我通常创建一个名为rails.validations.custom.js的新文件。这是我一直在使用的惯例,因为我不想弄乱核心文件。

// rails.validations.custom.js
clientSideValidations.validators.local['word_limit'] = function(element, option) {
  if (!/^(?:\b\w+\b[\s\r\n]*){1,100}$/.test(element.val())) {
    return options.message;
  }
});

那应该这样做。如果您要复制/粘贴,我可能会犯一些语法错误,因为我这样做是不可能的。

说实话,为什么不使用Rails格式验证器呢?您可以在模型中执行此操作:

validates :body, :format => { :with => /^(?:\b\w+\b[\s\r\n]*){1,100}$/, :message => "is not formatted properly" }

这有效地让你得到同样的东西。

答案 1 :(得分:0)

另外一件事,你所拥有的正则表达式可能会或可能不会在Javascript中工作。 Javascript和Ruby有不同的正则表达式引擎,虽然大多数东西都适用于所有事情。所以你可能必须在javascript中测试表达式,看看你是否得到了你想要的结果。如果没有,那么你需要在javascript验证器中使用不同的正则表达式。

答案 2 :(得分:0)

我刚刚添加了上述功能。如果您将Gemfile指向Github上的主分支,您应该能够以我描述的方式有条件地强制验证器。

相关问题