欧芹 + Rails 5 + 无法验证电子邮件地址

Parsley + Rails 5 + Unable to validate Email address

型号:

class User < ApplicationRecord
  VALID_EMAIL_REGEX = /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i
  validates :email,
        presence: true,
        format: { with: VALID_EMAIL_REGEX }
end

HTML :

<%=
   f.email_field :email,
   placeholder: 'email',
   class: "form-control",
   id:"user_email",
   data: {
     parsley_required: "",
     parsley_pattern: User::VALID_EMAIL_REGEX,
     parsley_type: "email"
   }
%>

编译后:

<input placeholder="email" class="form-control" id="user_email" data-parsley-required="" data-parsley-pattern="&quot;(?i-mx:\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z)&quot;" data-parsley-type="email" type="email" value="" name="user[email]">

不工作。请推荐

Ruby中字符串锚点的开始用\A运算符定义,字符串锚点结束用\z表示。但是,在 JavaScript 中,分别使用了 ^$ 锚点。此外,当您将 Ruby Regexp 对象发送到 JS Parsley 时,#to_s 是 运行 并且您会得到混合了修饰符的模式,这些修饰符添加在它们的 内联形式,例如(?-im:).

你可以做的是将 VALID_EMAIL_REGEX 的值设置为 String 就像 '[^@\s]+@(?:[-a-zA-Z0-9]+\.)+[a-z]{2,}' (注意我删除了不必要的捕获组,因为你不会去访问这些子匹配项,也不是反斜杠是单个的,因为文字是单引号),然后使用 format: { with: Regexp.new("\A#{VALID_EMAIL_REGEX}\z") } 在 RoR 部分动态构建正则表达式(因此,锚点对于 Ruby - 反斜杠加倍,因为它是双引号字符串文字)并使用 parsley_pattern: "^"+User::VALID_EMAIL_REGEX + "$".

^/$ 锚点传递给 Parsley JS
Resulting model:

class User < ApplicationRecord
  VALID_EMAIL_REGEX = '[^@\s]+@(?:[-a-zA-Z0-9]+\.)+[a-z]{2,}'
  validates :email,
    presence: true,
    format: { with: Regexp.new("\A#{VALID_EMAIL_REGEX}\z") }
end

结果HTML:

<%=
    f.email_field :email,
    placeholder: 'email',
    id:"user_email",
    data: {
      parsley_required: "",
      parsley_pattern: "^"+User::VALID_EMAIL_REGEX + "$",
      parsley_type: "email"
    }
%>

为了以防万一,这里有一个Parsley JS fiddle

此外,您可以简单地使用 data-parsley-type="email" 而不是 pattern。这使用 Parsley 的内置(并且更准确)正则表达式来处理电子邮件。