Rails中的常量值

时间:2008-12-11 22:30:11

标签: ruby-on-rails ruby constants

我有一些数据要存储在我的Rails应用程序中,因为我用它来生成表单字段,检查提交的表单以确保其值有效等等。基本上,我希望数据在一个位置,因为我在几个地方使用它。

以前,我在我的控制器中定义了一个initialize方法,并在该方法中初始化实例变量,例如@graph_types = ['bar', 'line']。这似乎是一个坏主意,因为实际上所有initialize都被用于(初始化这些值),实例变量可以在以后更改,这是我不想要的。

现在,我在控制器中的任何方法之外定义常量,在我的过滤器后面的顶部,然后我冻结它们,例如GraphTypes = ['bar', 'line'].freeze

我不想将这些数据存储在配置文件中,因为那时我必须跟踪一个额外的文件,读入文件并解析它等等。我不想将这些数据存储在数据库,因为这似乎有点过分;我不需要做任何疯狂的LEFT OUTER JOIN类型查询,将可用的图形类型与我的另一个常量相结合,比如Themes = ['Keynote', 'Odeo', '37 Signals', 'Rails Keynote'].freeze。我不想将数据存储在environment.rb中,因为此数据仅适用于特定的控制器。

考虑到这一切,我是否会采用这种“Ruby方式”?

6 个答案:

答案 0 :(得分:29)

对于那些不属于其他任何地方的常量,我有一个StaticData类。

  class StaticData

    GRAPH_TYPES = ['bar', 'line']

    SOMETHING_ELSE = ['A', 'B']

  end

然后我用

来实现它
StaticData::GRAPH_TYPES

答案 1 :(得分:11)

同样的答案I wrote previously to a similar question适用并发布,因为此答案仍会出现在搜索结果中。

在控制器中加一个常量会有一些意义,因为常量与它直接相关。否则,常量应放在专用的初始化文件中:Rails.root/config/initializers/constants.rb

根据application.rb中列出的评论:

# Application configuration should go into files in config/initializers
# -- all .rb files in that directory are automatically loaded

This is still valid as of Rails 3.

答案 2 :(得分:9)

我相信你现在所做的很好;你说数据只与一个控制器有关,因此它就属于它。如果多个控制器需要它,或者它们比常量值更复杂,则其他方法可能有意义。

答案 3 :(得分:4)

是的,你在做什么都没关系。尽管如此,调用你的常量GRAPH_TYPES是更惯用的Ruby。

顺便说一下,我会避免在你的控制器中定义initialize。好像它可能导致麻烦。

答案 4 :(得分:3)

我同意IDBD和paradisepete的一些内容。在模型中使用常量将是最好的方法,以便控制器是瘦的,模型是胖的。见Rails view tips 例如,如果您将度量标准控制器链接到度量标准模型。在度量模型中 class Metric<的ActiveRecord :: Base的   GRAPHTYPES = ['bar','line']

然后在视图中你可以做类似

的事情

f.select:graph_type,Metric :: GRAPHTYPES

答案 5 :(得分:1)

如果要生成与某些资源相关的表单,那么将它存储在模型中将是一个很好的变体。您不需要将其存储在DB中,因为它可以是简单的类或实例变量/方法。

同样的想法是验证。如果您正在验证资源/模型实例,那么将验证参数存储在模型类中是合理的选择。

无论如何,它会更接近'厚模型和薄控制器'模式,然后是您提到的任何变体。