控制器中的ROR +访问常量和Config / initializer / constant.rb中的定义

时间:2011-06-17 12:06:24

标签: ruby-on-rails ruby constants

在我的项目中,我想使用常量来代替简单的字符串。为此,我在config/initiailizer/constant.rb文件中定义了颜色常量。这是代码::

RED = "red"
GREEN = "green"
STALE = "stale"
YELLOW = "yellow"

现在我想在我的一个控制器中访问此常量,以便如何访问它。我在Google上搜索了一些东西但是没有取得任何成功。请看看。

2 个答案:

答案 0 :(得分:4)

如果您使用的是Rails 3,则可以将常量存储在constant.rb文件中,如下所示:

AppName::Application.config.YELLOW = "yellow"

以相同的方式从任何地方(控制器,模型等)访问它们:

AppName::Application.config.YELLOW

如果你需要存储一些特定于环境的常量,你可以在config / config.yml中创建一个YML文件,内容如下:

development:
  yellow: "yellow"

production:
  yellow: "green"

并将此黄色常量替换为:

AppName::Application.config.COLOR = YAML.load_file("#{Rails.root}/config/config.yml")[Rails.env]

并访问您的环境特定的COLOR常量,如下所示:

AppName::Application.config.COLOR[:yellow]

答案 1 :(得分:2)

如果你只是存储指向同名字符串的常量,那么你应该只使用符号。它们在内存方面更好,而且你并没有将这种尴尬的伪企业需求强加到Rails中。

所以不要使用这样的东西:

class MyController < ApplicationController
  def show
    @background_color = ::GREEN
  end
end

您可以使用符号:

class MyController < ApplicationController
  def show
    @background_color = :green
  end
end

另外,如果你坚持定义一堆相关的颜色常数,你应该真的避免用它们污染全局范围,而是将它们包装在一个模块中:

module Colors
  GREEN = 'green'
  BLUE = 'blue'
  ...
end

然后访问它们(从另一个[例如控制器]中定义的另一个类/模块中):

puts "I'm #{::Colors::BLUE}, like him, inside and outside."

或者,如果您经常在其他课程/模块中使用它们:

class Eiffel65
  include ::Colors

  def house_color
    BLUE
  end
end

有意义吗?