2011-05-16 49 views
6

我已经有client_side_validations gem在我的表单上工作得很棒。我为我的用户模型使用Devise,当我进入edit_user_registration表单时,除了:current_password,:password和password_confirmation字段之外的所有内容都会进行验证。Rails 3:client_side_validations宝石和设计密码验证

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

感谢任何帮助

http://pastie.org/1907464

回答

14

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

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

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

因此,我打算很快发布一个新版本,这将允许您显式重写条件过滤器。它的工作是这样的:

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

​​

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

+0

我最近尝试过使用您建议的方法,可悲的是它没有奏效。我最终将这添加到我的模型中:'如果we_need_to_validate_some_more; validates_presence_of:not_always_important_field; end'。像服务器端的魅力一样工作,它会被你的宝石拾起。 – dimitarvp 2012-07-26 17:30:58

+0

这个评论是一年多以前,最有可能不再有效 – bcardarella 2012-08-01 21:45:18

4

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

+0

非常感谢我现在工作。附注:有没有办法显示验证通过时的通知?那么我可以用红色来表示失败,绿色表示成功吗? – 2011-05-21 00:30:32

+0

你会想要使用回调。 https://github.com/bcardarella/client_side_validations/wiki/Callbacks – bcardarella 2011-05-24 06:46:53

+0

嗨,我注意到client_side_validations只在<%= f.password_field:password%>上调用,而不是在<%= f上调用。password_field:password_confirmation%>。因此,如果我从password_confirmation字段中退出,则不显示任何内容。有没有一种方法来验证密码和password_confirmation匹配?或者至少一个password_confirmation验证? – 2011-06-17 22:53:35

0

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

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