将新表单添加到DOM时,client_side_validations(3.1.0)无法正常工作
我正在使用Rails 3.1.0rc4和client_side_validations 3.1.0。 只要表单在主请求中呈现,一切都可以正常工作。 但是,如果表单本身通过javascript添加到页面,则提交表单会导致服务器端validation。 我怀疑问题是,当表单通过javascript添加到页面时,我需要以某种方式“绑定”客户端validationfunction。
例如,假设我有一个简单的表单,您可以在其中发布新的职位列表:
#jobs/new.html.erb true do |f| %> 'common/form_errors', :locals => {:record => @job} %>
以及我模型中的以下validation:
class Job < ActiveRecord::Base validates_presence_of :title, :description end
如果我通过访问浏览器中的new_job_path来访问此表单,我的客户端validation效果很好。
但是,如果我将此表单插入另一个页面(例如jobs_path索引页面),如下所示:
#jobs/index.html.erb true %>
和:
#jobs/new.js.erb $('#form-job-new').append(" 'jobs/new.html.erb') %>");
然后在提交表单时,validation将应用于服务器端。
知道我错过了什么吗?
在这个gem的javascript源代码中找到答案:
// Main hook // If new forms are dynamically introduced into the DOM the .validate() method // must be invoked on that form $(function() { $('form[data-validate]').validate(); })
所以,在我的特定情况下,我需要这样做:
#jobs/new.js.erb $('#form-job-new').append("<%= escape_javascript render(:file => 'jobs/new.html.erb') %>"); $('form[data-validate]').validate();
根据你使用ujs的程度(我做了很多),做这样的事情可能更有意义,而不是在每个ujs文件中调用validate方法。
$('body').bind("ajax:success", function() { if($('form[data-validate]').length){ $('form[data-validate]').validate(); } });
或coffeescript
$("body").bind "ajax:success", -> $("form[data-validate]").validate() if $("form[data-validate]").length