Ruby on rails Rails中的常量值

Ruby on rails Rails中的常量值,ruby-on-rails,ruby,constants,Ruby On Rails,Ruby,Constants,我想将一些数据存储在Rails应用程序的某个位置,因为我使用它生成表单字段,检查提交的表单以确保其值有效,等等。基本上,我希望数据位于一个位置,因为我在多个位置使用它 以前,我在控制器中定义了一个initialize方法,并在该方法中初始化实例变量,例如@graph\u types=['bar','line']。这似乎是一个坏主意,因为这实际上是所有的initialize都被用来(初始化那些值)并且实例变量可以在以后更改,这是我不想要的 现在,我在控制器中的任何方法之外定义常量,在过滤器之后的顶

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

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

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

我不想将这些数据存储在配置文件中,因为这样我就必须跟踪一个额外的文件,读入该文件并解析它,等等。我不想将这些数据存储在数据库中,因为这看起来太过分了;我不需要做任何疯狂的左外连接类型查询,将可用的图形类型与我的另一个常量组合在一起,比如
Themes=['Keynote','Odeo','37 Signals','Rails Keynote']。我不想将数据存储在environment.rb中,因为这些数据只属于特定的控制器


考虑到所有这些,我是不是要走“红宝石之路”?

我相信你目前所做的一切都很好;您说过数据只属于一个控制器,因此它就属于这个控制器。如果多个控制器需要它,或者如果它们比常量值更复杂,那么其他方法可能是有意义的。

是的,您所做的很好。不过,调用常量
GRAPH\u类型更符合Ruby的习惯


顺便说一句,我会避免在控制器中定义
初始化
。似乎这可能会导致麻烦。

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

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


无论如何,它将比您提到的任何变体更接近“厚模型和瘦控制器”模式。

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

  class StaticData

    GRAPH_TYPES = ['bar', 'line']

    SOMETHING_ELSE = ['A', 'B']

  end
然后我就开始跟你说了

StaticData::GRAPH_TYPES

我同意IDBD和paradisepete的一些观点。在模型中使用常量将是最好的方法,这样控制器会变瘦,而模型会变胖。看见 例如,如果有一个度量控制器链接到度量模型。在度量模型中 类度量 然后在视图中,您可以执行以下操作

f、 选择:graph_type,Metric::GRAPHTYPES

相同的答案适用,并在搜索结果中显示此答案时发布

在控制器中放置一个常数是有意义的,因为该常数直接与控制器相关。否则常量应该放在专用的初始值设定项文件中:
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

你把课程放在哪里?你把它和你的模型放在一起了吗?嗯,我把它放在models目录下,但是最好放在lib.Sasha中,你用哪个范围来定义
config/initializers/constants.rb
文件中的constatns?您是否将
MAGIC_NUMBER=42
放在全局范围内,将其包装在您的应用程序的
模块中
块,或者其他什么东西?@evanrmurphy,这取决于您。在名称空间中包装常量是避免命名冲突的最安全方法,并且在使用常量时还会添加额外的上下文,但有些人不喜欢使用名称空间(即全局范围)。