型号:
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]">
不工作。请建议
答案 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的内置(并且更准确)正则表达式用于电子邮件。