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

 醒葛 发布于 2023-02-08 11:15

我为电子邮件,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

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

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

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

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

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

    module Fooapp
    end
    

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

    require 'fooapp'
    

    在这种情况下,延迟加载文件将不起作用,因为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
    

    2023-02-08 11:16 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有