我在rails应用程序上使用了判断gem来进行客户端验证。我的用户模型的验证看起来像这样:
VALID_EMAIL_REGEX = /^[\w+\-.]+@[a-z\d\-.]+\.[a-z]+$/i
VALID_USERNAME_REGEX = /^[A-Za-z\d_]+$/
validates :username, :presence => true,
:uniqueness => true,
:length => { :within => 2..49 },
:format => { :with => VALID_USERNAME_REGEX, :multiline => true },
:exclusion => { :in => RESERVED_HANDLERS }, :on => :create
validates :email, presence: true,
length: { maximum: 50 },
format: { with: VALID_EMAIL_REGEX, :multiline => true },
uniqueness: { case_sensitive: false }
由于我们点击了服务器的唯一性,我已经在初始化程序中公开了:username和:email for judge:
Judge.configure do
expose User, :username, :email
end
现在问题是:理想情况下,我希望在客户端本身验证电子邮件和用户名格式,而不需要服务器,但我也想在服务器端保持相同的安全措施。所以请注意我放入的正则表达式与rails&两者都是javascript,我设置了:multiline =>对于^ $ end字符也是如此。
但这并不像预期的那样有效。客户端验证不能完美地用于1.:唯一性和2.电子邮件/用户名格式。为什么:uniqueness =>真的不行吗?
答案 0 :(得分:0)
对于正则表达式问题:
将此代码放入judge.rb初始化程序中:
Judge::Validator.class_eval do
def to_hash
{
:kind => kind,
:options => get_js_compatible_options(options),
:messages => messages.to_hash
}
end
private
def get_js_compatible_options(options)
method_name = "get_js_compatible_#{self.kind}"
if self.respond_to? method_name, options
options = self.send method_name, options
end
options
end
def get_js_compatible_format(options)
format_options = Hash.new
options.each do |key, option|
format_options[key] = (key == :with) ? convert_regex_to_js_compatible(option) : option
end
format_options
end
def convert_regex_to_js_compatible(regex)
js_regex_source = regex.source.sub(/^\\A/, '^').sub(/\\z$/i, '$')
/#{js_regex_source}/
end
end
然后使用这个正则表达式:
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
VALID_USERNAME_REGEX = /\A[A-Za-z\d_]+\z/
Judge会自动将它们转换为兼容javascript的版本。