如何在Rails 4中存储自定义常量?

14

我为电子邮件、比特消息等制作了一些常规表达式,并将它们作为常量放置在

#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

这是一个好习惯吗?最佳储存方式是什么?


这不是一个答案。给定的字符串不是正则表达式字面量。如果您想表示正则表达式字面量,请删除周围的 " - falsetru
为什么不使用match呢?if @user.contact.match(REGEXP_EMAIL) - hwnd
@hwnd,因为它看起来很干净。这种方法是否已被弃用或不允许使用? - br.
[123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ] 看起来很糟糕。你可能会错过 lIO(或者这是故意的?)。除非缺少的字符是有意为之,否则可以简写为 [1-9a-zA-Z] - nhahtdh
如果您不打算更改它们,可以将它们存储到数据库中,但使用常量是正确的。那么将它们存储起来有什么用呢? - Малъ Скрылевъ
显示剩余4条评论
1个回答

25

有道理,这是其中一种可能的方法。唯一的缺点是,常量会污染全局命名空间。

我通常喜欢的方法是将它们定义在应用程序命名空间内部。

假设您的应用程序名称为Fooapp,那么您已经由Rails定义了一个Fooapp模块(请参见config/application)。

我通常会在lib中创建一个fooapp.rb文件,如下所示:

module Fooapp
end

我将内部的常量降低了。同时确保在application.rb文件的底部要求它。

require 'fooapp'

在这种情况下,文件的懒加载将不起作用,因为Fooapp模块已经被定义。

当常量的数量足够多时,可以将它们移到一个单独的文件中,例如/lib/fooapp/constants.rb。最后这一步只是简单的改进,将所有常量分组到一个简单的地方(我倾向于大量使用常量来替换魔法数字或进行优化,尽管Ruby 2.1冰冻字符串字面值的改进可能会让我删除几个常量)。

还有一点,如果正则表达式特定于一个模型,您可以将其存储在模型本身内并创建一个模型方法。

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

我不确定那是否是放置这些常量的最佳位置:REGEXP_EMAIL 不仅仅与用户相关,它是用于解析电子邮件的东西,这些常量可能也存在于其他模型中。 - Alessandro De Simone

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接