Rails:验证有很多格式

时间:2017-12-26 00:01:24

标签: ruby-on-rails ruby validation model

我想验证一个昵称,但我有很多这样的格式:

validates :nickname, presence: true, unniqueness: true, format: { with: /\A[a-zA-Z0-9]+\Z/ }, format: {  without: /\s/ }, format: { without: /[!-\/\@\^\~\`\(\)\[\]\>\<\=]/ }

warning: key :format is duplicated and overwritten on line 38
warning: key :format is duplicated and overwritten on line 38

显然不会这样工作,我该如何解决?谢谢

1 个答案:

答案 0 :(得分:2)

你的第一个正则表达式涵盖了所有内容:

format: { with: /\A[a-zA-Z0-9]+\Z/ }

但您可能希望\z而不是\Z来避免跟踪换行符的问题。匹配/\A[a-zA-Z0-9]+\z/的任何内容都不会包含任何空格字符,因此/\s/测试已经涵盖,类似于标点符号测试。

此外,您已将uniqueness拼错为unniqueness,因此您也需要修复此问题。

那会让你只是:

validates :nickname, presence: true, uniqueness: true, format: { with: /\A[a-zA-Z0-9]+\Z/ }

如果您确实有多个正则表达式进行测试,那么您可以使用自定义方法执行此操作:

validate :nickname_format

def nickname_format
  return if(!nickname) # The `presence: true` takes care of complaining about this.
  if(nickname ~! ...)
    errors.add(:nickname, 'blah blah')
  elsif(...)
    ...
  end
end

这样您就可以单独检查每个正则表达式。