jQuery验证REGEX总是失败

时间:2019-12-13 06:28:22

标签: jquery ruby-on-rails regex ruby validation

当正确的正则表达式时,jQuery验证总是失败,正则表达式检查框中的文本是否与以下格式匹配:YYYY-MM-DD。尝试了所有可以找到的不同方式。使用jquery-validation gem和javascript文件会在所有其他验证正常工作的情况下正确加载,但该日期始终会失败。

JavaScript文件:

$(document).on('turbolinks:load',function() {
  $("#new_grand_prix").validate({
    rules: {
      "grand_prix[name]": {required: true},
      "grand_prix[laps]": {required: true, min: 0, digits: true},
      "grand_prix[country]": {required:true},
      "grand_prix[date]": {required: true, correctDateForm: true},
    }
  });
  jQuery.validator.addMethod("correctDateForm", function(value, element) {
    var r = new RegExp('^\d{4}\-(0[1-9]|1[012])\-(0[1-9]|[12][0-9]|3[01])');
    var test = r.test($('#grand_prix_date').html());
    return test;
  }, "Date must be in the following format: YYYY-MM-DD");
});

查看:

<script src="validate_new_grand_prix_form.js"></script>
<%= form_with(model: grand_prix, local: true, id: 'new_grand_prix') do |form| %>
  <% if grand_prix.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(grand_prix.errors.count, "error") %> prohibited this grand_prix from being saved:</h2>

      <ul>
      <% grand_prix.errors.full_messages.each do |message| %>
        <li><%= message %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field">
    <%= form.label :name %>
    <%= form.text_area :name %>
  </div>

  <div class="field">
    <%= form.label :laps %>
    <%= form.number_field :laps %>
  </div>

  <div class="field">
    <%= form.label :country %>
    <%= form.text_area :country %>
  </div>

  <div class="field">
    <%= form.label :date %>
    <%= form.text_area :date %>
  </div>

  <div class="actions">
    <%= form.submit %>
  </div>
<% end %>

1 个答案:

答案 0 :(得分:0)

该代码至少存在2个问题:

1。 RegExp

反斜杠转义字符串中的下一个字符。例如,'\hello'输出'hello',而'\\hello'输出'\hello'。由于它作为字符串传递,因此在您的模式中会出现问题。

所以,改变

var r = new RegExp('^\d{4}\-(0[1-9]|1[012])\-(0[1-9]|[12][0-9]|3[01])');

var r = new RegExp(/^\d{4}\-(0[1-9]|1[012])\-(0[1-9]|[12][0-9]|3[01])/);

2。如何获取输入值

如果输入$('#grand_prix_date'),请使用val()而不是html()来获取其内容。

所以,改变

var test = r.test($('#grand_prix_date').html());

var test = r.test($('#grand_prix_date').val());

请注意,您的RegExp会将0000-02-31视为有效日期,但是我认为该讨论超出了此问题的范围:)祝您好运!