Rails 3:client_side_validations gem和设计密码验证

时间:2011-05-16 01:23:58

标签: ruby-on-rails-3 devise client-side-validation

我的client_side_validations gem在我的表单上工作得非常好。我正在为我的用户模型使用Devise,当我转到edit_user_registration表单时,除了:current_password,:password和:password_confirmation字段之外的所有内容都会抛出验证。

Fort实例是我将电子邮件留空,当我退出该字段时,验证会立即弹出。但是,如果我将current_password字段留空并且tab没有发生任何事情,那么当我提交表单时,我收到错误“1错误禁止此用户被保存:密码不能为空”

感谢您的帮助

http://pastie.org/1907464

3 个答案:

答案 0 :(得分:14)

目前,ClientSideValidations将过滤掉任何条件验证器。 Devise将一些验证器设置为条件:https://github.com/plataformatec/devise/blob/master/lib/devise/models/validatable.rb#L24-32

我这样做的原因是因为没有好的方法让客户确定该条件的真实价值。我可以在生成表单时执行此操作,但如果该条件依赖于可以在表单上更改的值,该怎么办?所以我选择过滤掉它们,让事情回到服务器上。

这是个主意,但显然它对某些事情施加了不公平的限制。这是最明显的(也很受欢迎)。

因此,我计划很快发布一个新版本,允许您明确覆盖条件过滤器。它会像这样工作:

<%= f.text_field :password, :validate => { :presence => true, :confirmation => true } %>

<%= f.text_field :password, :validate => true %>

在第一种情况下,您可以选择关闭过滤器的验证器。在第二种情况下,它将为该属性上的所有验证器关闭过滤器。条件将在生成表单时进行评估,如果它通过则将验证器添加到输入元素以供客户端使用。

答案 1 :(得分:4)

主分支现在支持这种格式。将你的Gemfile指向它,你应该很好

答案 2 :(得分:0)

很简单! gem扩展了Rails默认表单构建器,您所要做的就是设置:validate =&gt;任何form_for上的true选项(或简单表单用户的simple_form_for)标记,您希望内联验证。表单构建器在模型验证中使用一些rails反射来生成一些json,它将在表单后包含在脚本标记中。然后,json使用json框架来执行需要执行的验证。

<%= form_for(@user, :url => registration_path(resource_name), :validate => true) do |f| %>