Rails:如何对验证和类方法使用单个正则表达式规则?

时间:2015-11-03 09:20:35

标签: ruby-on-rails regex dry

我试图让我的代码保持干净。

我想做的是这样的事情:

class User < ActiveRecord::Base
  validates :username, format { with: /\A[:alnum:]+\z/}

  def self.create_with_username(name)
    username = name.match(/\A[:alnum:]+\z/) if name
  end
end

我正在复制正则表达式匹配规则:/\A[:alnum:]+\z/

我的问题是如何让/\A[:alnum:]+\z/干,以便我可以在验证和.match方法中使用它?到目前为止,我尝试制作一个类方法,但验证似乎并没有找到它。当我尝试使它成为一个常量时,.match方法不会提取它(可能导致.match方法在类方法中...)

谢谢。

2 个答案:

答案 0 :(得分:0)

您需要将POSIX类放在字符类中。

\A[[:alnum:]]+\z

答案 1 :(得分:0)

您应该将格式存储为常量或类方法,而不是局部变量:

#constant
USERNAME_FORMAT = /\A[:alnum:]+\z/  # <-- What I want to keep DRY

#class method
def self.username_format
  /\A[:alnum:]+\z/
end

然后你可以说(使用常数例子)

validates :username, format { with: USERNAME_FORMAT}

def self.create_with_username(name)
  username = name.match(USERNAME_FORMAT) if name
end