Вам следует взглянуть на создание собственного конструктора форм для настройки поведения 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
, чтобы использовать ValidationFormBuilder.
<%= 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. Надеюсь, этого достаточно, чтобы вы начали.