gpt4 book ai didi

ruby-on-rails - Ruby on Rails : Where to define global constants?

转载 作者:行者123 更新时间:2023-12-03 04:10:11 24 4
gpt4 key购买 nike

我刚刚开始使用我的第一个 Ruby on Rails Web 应用程序。我有很多不同的模型、 View 、 Controller 等等。

我想找到一个好地方来保存真正全局常量的定义,这些常量适用于我的整个应用程序。特别是,它们既适用于我的模型的逻辑,也适用于我的观点所做出的决策。我找不到任何干燥的地方来放置这些定义,它们既适用于我的所有模型,也适用于我的所有 View 。

举个具体的例子,我想要一个常量 COLOURS = ['white', 'blue', 'black', 'red', 'green'] 。这在模型和 View 中随处可见。我可以在哪里将其定义在一处以便可以访问?

我尝试过的:

  • model.rb 文件中与它们最相关的常量类变量,例如 @@COLOURS = [...] 。但我找不到一个合理的方法来定义它,以便我可以在我的 View 中写入Card.COLOURS而不是像 Card.first.COLOURS 这样的笨拙的东西.
  • 模型上的方法,例如 def colours ['white',...] end - 同样的问题。
  • application_helper.rb 中的方法 - 这就是我到目前为止所做的,但助手只能在 View 中访问,而不能在模型中访问
  • 我想我可能在application.rb或environment.rb中尝试过一些东西,但那些看起来并不正确(而且它们似乎也不起作用)

是否没有办法定义可以从模型和 View 访问的任何内容?我的意思是,我知道模型和 View 应该是分开的,但在某些领域中肯定有时它们需要引用相同的特定领域知识?

最佳答案

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

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

# accessible like this
Card.colours

或者,您可以创建类变量和访问器。然而,不鼓励这样做,因为类变量在继承和多线程环境中可能会表现得令人惊讶。

class Card < ActiveRecord::Base
@@colours = ['white', 'blue'].freeze
cattr_reader :colours
end

# accessible the same as above
Card.colours

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

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

# accessible as a top-level constant this time
COLOURS

注意:当我们定义上面的常量时,通常我们想要卡住数组。这可以防止其他代码稍后(无意中)通过例如以下方式修改数组:添加一个新元素。一旦对象被卡住,就无法再更改。

关于ruby-on-rails - Ruby on Rails : Where to define global constants?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4110866/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com