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

时间:2017-05-10 07:44:16

标签: ruby-on-rails regex parsley.js

型号:

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]">

不工作。请建议

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

此外,您只需使用data-parsley-type="email"代替pattern。这使用Parsley的内置(并且更准确)正则表达式用于电子邮件。