Ruby on Rails:在哪里定义全局常量?

我刚开始使用我的第一个Ruby on Rails web应用程序。 我有很多不同的模型,视图,控制器等等。

我想找到一个合适的地方来粘贴真正的全局常量的定义,这些定义适用于整个应用程序。 特别是,它们都适用于我的模型逻辑以及我的观点所作的决定。 我找不到任何干燥的地方把这些定义放在他们可用于所有模型和我所有观点的地方。

举一个具体的例子,我想要一个常量COLOURS = ['white', 'blue', 'black', 'red', 'green'] 。 这被用在所有地方,在模型和视图中。 我可以在哪里将它定义在一个地方以便可以访问?

我试过的:

  • model.rb文件中与它们最相关的常量类变量,例如@@COLOURS = [...] 。 但是我找不到一个理智的方式来定义它,这样我就可以在我的视图Card.COLOURS写入,而不是像Card.first.COLOURS这样的Card.first.COLOURS
  • 模型上的一种方法,就像def colours ['white',...] end一样 - 同样的问题。
  • application_helper.rb中的方法 - 这是我迄今为止所做的,但助手只能在视图中访问,而不能在模型中访问
  • 我想我可能在application.rb或environment.rb中尝试了一些东西,但这些看起来并不正确(而且它们似乎也不工作)
  • 有没有办法定义任何模型和视图都可以访问的东西? 我的意思是,我知道模型和视图应该是分开的,但是在某些领域肯定会有时需要引用相同的领域特定知识?


    如果你的模型对于常量真的是“负责任的”,你应该把它们放在那里。 您可以创建类方法来访问它们而无需创建新的对象实例:

    class Card < ActiveRecord::Base
      def self.colours
        ['white', 'blue']
      end
    end
    
    # accessible like this
    Card.colours
    

    或者,您可以创建类变量和访问器。 然而,由于类变量在继承和多线程环境中可能会带来令人惊讶的结果,所以这是令人沮丧的。

    class Card < ActiveRecord::Base
      @@colours = ['white', 'blue']
      cattr_reader :colours
    end
    
    # accessible the same as above
    

    如果需要,上述两个选项允许您在每次调用访问方法时更改返回的数组。 如果你有一个真正的不变的常量,你也可以在模型类中定义它:

    class Card < ActiveRecord::Base
      COLOURS = ['white', 'blue'].freeze
    end
    
    # accessible as
    Card::COLOURS
    

    您还可以创建全局常量,这些常量可以在初始化程序中的任何地方访问,如下例所示。 这可能是最好的地方,如果你的颜色真的是全球性的并且在不止一个模型环境中使用。

    # put this into config/initializers/my_constants.rb
    COLOURS = ['white', 'blue'].freeze
    

    注意:当我们定义上面的常量时,通常我们想要freeze数组。 这可以防止其他代码在后来(无意中)通过添加新元素来修改数组。 一旦对象被冻结,它就不能再被改变。


    一些选项:

    使用常数:

    class Card
      COLOURS = ['white', 'blue', 'black', 'red', 'green', 'yellow'].freeze
    end
    

    使用类实例变量延迟加载:

    class Card
      def self.colours
        @colours ||= ['white', 'blue', 'black', 'red', 'green', 'yellow'].freeze
      end
    end
    

    如果它是一个真正的全局常量( 尽管避免了这种性质的全局常量 ),那么也可以考虑在config/initializers/my_constants.rb放置一个顶级常量。


    从Rails 5.0开始,您可以直接使用configuration对象进行自定义配置:

    config/application.rb (或者config/custom.rb如果你愿意的话)

    config.colours = %w(white blue black red green)
    

    它将以下列形式提供:

    Rails.configuration.colours # => ["white", "blue", "black", "red", "green"]
    

    注意:对于4.2版本,您需要使用config.x属性:

    config.x.colours = %w(white blue black red green)
    

    这将可用作为:

    Rails.configuration.x.colours # => ["white", "blue", "black", "red", "green"]
    
    链接地址: http://www.djcxy.com/p/35145.html

    上一篇: Ruby on Rails: Where to define global constants?

    下一篇: How do I create delegates in Objective