2011-08-24 55 views
2

我正在使用Rails 3应用程序,并使用client_side_validations(自动从ActiveRecord模型验证生成的JavaScript验证)显示在JQuery UI对话框中的表单中,我想知道是否有一些来自client_side_validations的javascript函数,我可以在用户按下对话框提交(OK)按钮之后调用,以验证表单中的所有验证是否在通过javascript提交表单之前通过。在client_side_validations中是否有这样的事情?我在wiki中注意到一个名为Client Side Validations callbacks的部分,看起来非常有趣,但是我没有在gem中看到相应的javascript文件。也许正在进行中的作品或某些不推荐的作品?手动访问client_side_validations验证功能

基本上我有一个创建一个包含表单

$(function() { 
    $("#subscription_dialog").dialog({ 
     autoOpen: false, 
     show: "blind", 
     hide: "blind", 
     width: 'auto', 
     height: 'auto', 
     modal: true, 
     title: "Become an Empower United member", 
     buttons: { 
      "OK": function() { 
       if ($('form[data-validate]').validate()) { 
        $('#new_subscription').submit(); 
        $(this).dialog("close"); 
       } 
      }, 
      "Cancel": function() { 
       $(this).dialog("close"); 
      } 
     } 
    }); 

    $("#subscribe").click(function() { 
     $("#subscription_dialog").dialog("open"); 
     return false; 
    }); 
}); 

我需要的表格前,一些验证检查提交位的对话框这个JavaScript片段,否则会对话即使在它的无效数据被关闭。我可以用jQuery的验证插件编写一个表单,但我不想像这样从模型层复制验证 - 我宁愿让它们始终保持同步。

预先感谢您可能决定渲染的任何帮助!

回答

2

你完成client_side_validations安装过程后(下的github README安装,确保做轨道g client_side_validations:copy_assets如果on Rails的3.1+)一个rails.validations.js文件应该被丢弃到您的app/assets/javascripts目录。

这包含用于客户端验证的javascript源代码。如果您在那里徘徊,可以看到它将javascript ajax:beforeSendsubmit事件处理程序绑定到您的表单。

所以他们应该在你的表单自动提交之前被调用。

然而,约手动应答更宽泛的问题,触发验证....

你可以打电话给你的表格上trigger并提供ajax:beforeSend事件手动触发验证。您还需要传入一个包含表单DOM元素的目标属性的对象(因为rails.validation.js源代码会检查以确保它只响应该表单元素的事件)。

有一点需要注意的是,client_side_validations会监听更改事件并跟踪自上次验证尝试以来您的输入是否已更改。因此,如果自上次验证以来没有任何字段发生更改,验证将不会运行。在这种情况下,您也可以手动触发更改。

所以......,将该代码:

handleAjaxError = function(event, data, status) { 
     $("form input").trigger("change"); 
     $("form").trigger("ajax:beforeSend", { target: this.$("form")[0] }); 
    }; 

不可否认,这种感觉那种哈克,引发了 “AJAX:beforeSend”。您也可以直接拨打isValid功能表单上,但是这需要你在验证,您只能从窗口DOM元素获得通过:

formValidationSettings = window[$('form').attr('id')]; 
    $('form').isValid(formValidationSettings.validators); 

挑选你的毒药

如果handleAjaxError功能似乎很奇怪,我需要这样做来处理电子邮件唯一性ajax验证的竞争条件,其中两个用户试图同时注册同一封电子邮件。客户端Ajax验证通过了两个用户的唯一性,第一个提交获得成功,第二个获取服务器端验证失败。我希望ajax错误处理程序通过重新运行验证来处理故障。

+0

这是真正有用的,谢谢! – hoitomt

+0

我想澄清一件事。看起来,将两种方法结合可以产生最佳结果。当我尝试使用第二种方法来查看是否需要将信息发送到服务器时,它总是返回误报。正如您在Jimbo之前所说的那样,我认为这是因为客户端验证会跟踪已更改的元素。因此触发事件来强制验证似乎也会在正确使用isValid后给出正确的结果。 –

5

上面的答案没有效果。我试图查看他们的代码,并最终找出答案。

form_validators = ClientSideValidations.forms[form.attr('id')].validators 
form.isValid(form_validators) 

这肯定会起作用。

这太晚了。但对于像我这样的人来说。这将有所帮助。

+0

谢谢发布!救了我。 – Eskim0