【问题标题】:Parsley + Rails 5 + Unable to validate Email addressParsley + Rails 5 + 无法验证电子邮件地址
【发布时间】:2017-05-10 07:44:15
【问题描述】:

型号:

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

不工作。请推荐

【问题讨论】:

  • JS RegExp 不支持内联修饰符和 \A / \z 锚点。 data-parsley-pattern 应设置为 "^[^@\s]+@(?:[-A-Za-z0-9]+\.)+[a-z]{2,}$"
  • 用您的建议值替换了用户常量。得到错误 activemodel-5.0.1/lib/active_model/validations/format.rb:44:in `check_options_validity': A regular expression or a proc or lambda must be provided as :with (ArgumentError)
  • 查看JSFiddle
  • 我想在 Rails 应用程序中将正则表达式设置为常量
  • 如果你像VALID_EMAIL_REGEX = '[^@\s]+@(?:[-a-zA-Z0-9]+\.)+[a-z]{2,}',然后format: { with: Regexp.new("\\A#{VALID_EMAIL_REGEX}\\z") }parsley_pattern: "^"+User::VALID_EMAIL_REGEX + "$",那样做呢?

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    在 Ruby 中,字符串锚点的开始用\A 运算符定义,字符串锚点的结束用\z 表示。但是,在 JavaScript 中,分别使用了 ^$ 锚点。此外,当您将 Ruby Regexp 对象发送到 JS Parsley 时,#to_s 会在其上运行,并且您会得到与以 inline 形式添加的修饰符混合的模式,例如(?-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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-10
      • 2012-04-08
      • 2013-09-29
      • 2014-06-12
      • 1970-01-01
      • 2018-03-13
      • 2011-09-02
      • 2013-02-20
      相关资源
      最近更新 更多