我为电子邮件,bitmessage等制作了一些正则表达式,并将它们作为常量添加到
中#config/initializers/regexps.rb
REGEXP_EMAIL = /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i
REGEXP_BITMESSAGE = /\ABM-[a-zA-Z1-9&&[^OIl]]{32,34}\z/
并像
一样使用它if @user.contact =~ REGEXP_EMAIL
elsif @user.contact =~ REGEXP_BITMESSAGE
这是好习惯吗?什么是存储它们的最佳方式?
答案 0 :(得分:23)
这是有道理的,这是可能的方法之一。这种方法的唯一缺点是常量会污染全局命名空间。
我通常喜欢的方法是在应用程序命名空间中定义它们。
假设您的应用程序名为Fooapp
,那么您已经有一个由Rails定义的Fooapp
模块(请参阅config/application
)。
我通常在fooapp.rb
内创建一个lib
文件,如下所示
module Fooapp
end
我把常量放在里面。另外,请确保在application.rb
文件
require 'fooapp'
在这种情况下,延迟加载文件将不起作用,因为已经定义了Fooapp
模块。
当常量的数量变得足够大时,您可以将它们更多地放入单独的文件中,例如/lib/fooapp/constants.rb
。最后一步只是一个简单的改进,将所有常量分组到一个简单的位置(我倾向于使用常量来替换幻数或进行优化,尽管Ruby 2.1 Frozen String literal improvements可能会让我删除几个常量。)
还有一件事。在您的情况下,如果正则表达式特定于一个模型,您可以将其存储在模型本身内并创建模型方法
class User
REGEXP_EMAIL = /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i
REGEXP_BITMESSAGE = /\ABM-[123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ]{32,34}\z/
def contact_is_email?
contact =~ REGEXP_EMAIL
end
end