您应该考虑创建自己的表单构建器来自定义表单的行为form_for
。您可以执行一些操作,将类设置为属性上定义的验证名称,并将 jQuery 将自身绑定到相应的类名称。让我们从表单生成器的外观开始。
class ValidationFormBuilder < ActionView::Helpers::FormBuilder
def text_field(object_name, method, options = {})
options[:class] = object_name.class.validators_on(method).map do |k|
# Eg: ActiveModel::Validations::PresenceValidator -> presence
k.to_s.slice(/[^:]+Validator$/).chomp('Validator').downcase
end.join(' ')
super(object_name, method, options)
end
end
你需要设置form_for
使用验证表单生成器。
<%= form_for @foo, :builder => ValidationFormBuilder do |f| %>
<%= f.text_field :bar %>
<% end %>
... becomes something like
<form action="/foo" method="post">
<input type="text" class="presence" name="foo[bar]" id="foo_bar">
</form>
如果您需要对类名称有更大的灵活性,您可能需要创建一个映射到所需字符串的散列。
class ValidationFormBuilder < ActionView::Helpers::FormBuilder
MAPPINGS = {
ActiveModel::Validations::PresenceValidator => 'text'
}
def text_field(object_name, method, options = {})
options[:class] = object_name.class.validators_on(method).map do |k|
MAPPINGS[k]
end.join(' ')
super(object_name, method, options)
end
end
您可以通过查看 Rails 中包含的验证的完整列表activemodel/lib/active_model/validations
Rails 源代码。我希望这足以让您开始。