Rails中的常量值

Sar*_*els 22 ruby ruby-on-rails 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方式"?

use*_*011 30

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

  class StaticData

    GRAPH_TYPES = ['bar', 'line']

    SOMETHING_ELSE = ['A', 'B']

  end
Run Code Online (Sandbox Code Playgroud)

然后我开始了

StaticData::GRAPH_TYPES
Run Code Online (Sandbox Code Playgroud)

  • 好吧,我把它放在models目录中,但将它放在lib中可能会更好. (3认同)
  • 你把课程放在哪里?你找到你的模特吗? (2认同)

小智 11

我之前写的类似问题的相同答案适用并发布,因为此答案仍然出现在搜索结果中.

在控制器中加一个常数会有一些意义,因为常量与它直接相关.否则,常量应放在专用的初始化文件中: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
Run Code Online (Sandbox Code Playgroud)

从Rails 3开始,这仍然有效.

  • @evanrmurphy由您决定。将常量包装在名称空间中是避免命名冲突的最安全方法,并且在使用常量时还会增加额外的上下文,但是有些人不喜欢任何名称空间(例如,全局范围)。 (2认同)

J C*_*per 9

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