25

我有一些数据想要存储在我的 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 方式”?

4

6 回答 6

31

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

  class StaticData

    GRAPH_TYPES = ['bar', 'line']

    SOMETHING_ELSE = ['A', 'B']

  end

然后我得到它

StaticData::GRAPH_TYPES
于 2008-12-13T02:45:42.540 回答
12

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

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

这在 Rails 3 中仍然有效。

于 2011-11-09T22:33:23.667 回答
10

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

于 2008-12-11T23:03:16.010 回答
4

是的,你正在做的很好。不过,将常量称为 Ruby 更为惯用GRAPH_TYPES

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

于 2008-12-12T08:54:38.577 回答
3

我同意 IDBD 和 Paradisepete 的一些观点。在模型中使用常量将是最好的方法,这样控制器会很瘦,而模型会很胖。请参阅Rails 视图提示 例如,如果您有一个指标控制器链接到一个指标模型。在度量模型类 Metric < ActiveRecord::Base GRAPHTYPES = ['bar', 'line']

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

f.select :graph_type, Metric::GRAPHTYPES

于 2009-06-18T10:19:21.993 回答
1

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

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

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

于 2008-12-12T16:53:32.673 回答