我已经编写了一个自定义验证器,正在寻找使其与client_side_validations gem一起使用的方法。现在它仍然允许我提交我的表单,然后我收到一个错误框和错误消息。我想知道是否有办法修改 gem 或我需要如何格式化验证。
这是我问的关于如何设置验证的最后一个问题:在 Rails 3 中编写自定义验证器
用正则表达式表示最大字数的最佳方法是吗?
wiki 有关于如何编写自定义验证器的非常详细的信息: 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 (!/^(?:bw+b[srn]*){1,100}$/.test(element.val())) {
return options.message;
}
});
这应该可以做到。如果您正在复制/粘贴,我可能会犯一些语法错误,因为我正在这样做。
老实说,为什么不直接使用 Rails 格式验证器呢?您可以在模型中执行此操作:
validates :body, :format => { :with => /^(?:bw+b[srn]*){1,100}$/, :message => "is not formatted properly" }
这有效地让你得到同样的事情。
还有一件事,你拥有的正则表达式在Javascript中可能有效,也可能不起作用。Javascript和Ruby有不同的正则表达式引擎,虽然大多数东西都可以同时工作。因此,您可能需要在javascript中测试表达式,以查看是否得到了所需的结果。如果没有,那么您需要在javascript验证器中具有不同的正则表达式。
我刚刚添加了上述功能。如果你将 Gemfile 指向 Github 上的主分支,你应该能够以我描述的方式有条件地强制验证器。