我正在开发一个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的验证插件编写一个表单,但我不想像这样复制模型层的验证 - 我宁愿让它们一直保持同步。
提前感谢您可能决定渲染的任何帮助!
答案 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:beforeSend
和submit
事件处理程序绑定到您的表单。
因此在表单自动提交之前应该调用它们。
但是,要回答有关手动触发验证的更一般的问题....
您可以在表单上调用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应用程序进行测试