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

br.*_*br. 11 regex ruby-on-rails constants ruby-on-rails-4

我为电子邮件,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/
Run Code Online (Sandbox Code Playgroud)

并使用它

if @user.contact =~ REGEXP_EMAIL
elsif @user.contact =~ REGEXP_BITMESSAGE
Run Code Online (Sandbox Code Playgroud)

这是好习惯吗?存储它们的最佳方法是什么?

Sim*_*tti 23

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

我通常喜欢的方法是在应用程序命名空间中定义它们.

假设您的应用程序被调用Fooapp,那么您已经有了一个Fooapp由Rails定义的模块(请参阅参考资料config/application).

我通常fooapp.rb在里面创建一个文件lib,如下所示

module Fooapp
end
Run Code Online (Sandbox Code Playgroud)

我把常数放在里面.还要确保在application.rb文件底部要求它

require 'fooapp'
Run Code Online (Sandbox Code Playgroud)

在这种情况下,延迟加载文件将不起作用,因为Fooapp模块已经定义.

例如,当常量的数量变得足够大时,您可以将它们更多地放入单独的文件中/lib/fooapp/constants.rb.最后一步只是一个简单的改进,将所有常量分组到一个简单的位置(我倾向于使用常量来替换幻数或进行优化,尽管Ruby 2.1 Frozen String文字改进可能会让我删除几个常量).

还有一件事.在您的情况下,如果正则表达式特定于一个模型,您可以将其存储在模型本身内并创建模型方法

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
Run Code Online (Sandbox Code Playgroud)