欧芹 + 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=""(?i-mx:\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z)"" 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 的内置(并且更准确)正则表达式来处理电子邮件。
型号:
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=""(?i-mx:\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z)"" 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 的内置(并且更准确)正则表达式来处理电子邮件。