2

使用 jQuery 进行表单验证就像在字段中添加类名一样简单。使用 rails 进行表单验证就像将条件放入控制器(和/或模型)一样简单。

我认为应该有一种方法可以编写一次验证并让它们同时应用于客户端和服务器端。我一直是编写自己的 javascript 的粉丝,但有了 rails3 的隐蔽性,如果 UJS 能够做到这一点,它在这里可能非常值得。

谢谢!!

4

4 回答 4

2

https://github.com/alluniq/validated-fields

于 2010-11-24T17:21:19.230 回答
2

您应该考虑创建自己的表单构建器来自定义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

activemodel/lib/active_model/validations通过查看Rails 源代码,您可以看到 Rails 中包含的完整验证列表。我希望这足以让你开始。

于 2010-10-17T13:59:09.273 回答
0

是否进行 JS 验证,包括一些用于验证唯一性的简洁的 ajax。

https://github.com/bcardarella/client_side_validations

http://railscasts.com/episodes/263-client-side-validations

于 2011-08-08T00:58:45.350 回答
0

您可以使用 RJS 使用服务器端验证(这不取决于您是否使用 UJS):

# create.js.haml
= render :partial => "shared/flash_messages", :locals => { :flash => flash }

- if @message.errors.any?
  $('#reply_message').html('#{escape_javascript(render(:partial => "message_form"))}');
- else
  $('ul.data_grid .list').append('#{escape_javascript(render "message", :message => @message)}');
  $('#reply_message textarea').val('');
于 2010-11-24T12:04:13.467 回答