手动访问client_side_validations验证功能

时间:2011-08-24 11:12:37

标签: jquery ruby-on-rails ruby validation

我正在开发一个Rails 3应用程序,我正在使用client_side_validations(从ActiveRecord模型验证自动生成的javascript验证)在JQuery UI对话框中显示的表单中,我想知道是否有一些来自client_side_validations的javascript函数,我可以在用户按下对话框提交(确定)按钮后调用,以验证在通过javascript提交表单之前表单中的所有验证都已通过。在client_side_validations中有这样的东西吗?我在wiki中注意到一个名为Client Side Validations callbacks的部分看起来非常有趣,但我没有在gem中看到相应的javascript文件。也许正在进行中的工作或被弃用的东西?

基本上我有这个javascript片段,用于创建包含表单

的对话框
$(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;
    });
});

我需要在表单提交位之前进行一些验证检查,否则即使包含无效数据,对话框也会关闭。我可以使用jquery的验证插件编写一个表单,但我不想像这样复制模型层的验证 - 我宁愿让它们一直保持同步。

提前感谢您可能决定渲染的任何帮助!

3 个答案:

答案 0 :(得分:5)

上述答案不起作用。我试着查看他们的代码,最后想出了答案。

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

这肯定会奏效。

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

答案 1 :(得分:2)

完成client_side_validations安装过程后(在github README上的安装下,确保在Rails 3.1+上执行rails g client_side_validations:copy_assets)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] });
   };

不可否认,这种感觉有点像hacky,触发了“ajax:beforeSend”。您也可以直接在表单上调用isValid函数,但这需要您传入验证器,您只能从窗口DOM元素中获取验证器:

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

选择你的毒药

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

答案 2 :(得分:1)

对于版本 3.2.7 ,我添加了一个关于触发所选输入https://github.com/DavyJonesLocker/client_side_validations/wiki/Manually-trigger-input-validation验证的Wiki页面。

代码如下:

$input = $('#validated_input')
$form = $input.closest('form')
$input.data('changed', true).isValid($form[0].ClientSideValidations.settings.validators)

使用Rails 4.2.0应用程序进行测试