微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ruby-on-rails – 如何在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/

并使用它

if @user.contact =~ REGEXP_EMAIL
elsif @user.contact =~ REGEXP_BITMESSAGE

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

解决方法

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

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

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

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

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

原文地址:https://www.jb51.cc/ruby/265859.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐