我已经编写了一个自定义验证器,并且正在寻找使用client_side_validations gem工作的方法。现在它仍然允许我提交我的表单,然后我得到一个错误框和错误消息。我想知道是否有办法修改gem或我需要如何格式化验证。
以下是我询问如何设置验证的最后一个问题:Writing custom validator in Rails 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上的主分支,您应该能够以我描述的方式有条件地强制验证器。