常数问题

时间:2011-01-10 09:03:22

标签: ruby-on-rails ruby-on-rails-3

在我的应用程序中,我有很多常量,所以我为这些常量创建了一个名为det_constants.yml的常量文件。

/config/det_constants.yml

DEFAULTS: &DEFAULTS
    company_type:  { "Private"                     : 1,
                     "Public"                      : 2  }
development:
  <<: *DEFAULTS

test:
  <<: *DEFAULTS

production:
  <<: *DEFAULTS

我在lib文件夹中有一个constants.rb文件,它加载这个常量文件。

/lib/constants.rb

module Constants
  # Allows accessing config variables from det_constants.yml like so:
  # Constants[:abc] => xyz
  def self.[](key)
    unless @config
      raw_config = File.read(Rails.root.to_s + "/config/det_constants.yml")
      @config = YAML.load(raw_config)[Rails.env].symbolize_keys
    end
    @config[key]
  end

  def self.[]=(key, value)
    @config[key.to_sym] = value
  end
end

在我的视图文件中,当我这样做时

<%= Constants[:company_type] %>

它会抛出错误

 NameError in Vendors#index 
uninitialized constant ActionView::CompiledTemplates::Constants

在第

<%= Constants[:company_type] %>

但是,如果我在控制台中做同样的事情,它会正常运行,

ruby-1.9.2-head > Constants[:company_type]
 => {"Private"=>1, "Public"=>2} 

我不知道问题出在哪里。如果在Rails 3中有一个新的更好的方法,请告诉我。

Ruby version: ruby 1.9.2p110 (2010-12-20 revision 30269) [i686-linux]
Rails version: Rails 3.0.3

2 个答案:

答案 0 :(得分:1)

我想你需要:

<% require 'constants' %>

此外,您需要在lib/更改后重新启动服务器;即使在开发模式下它也不会自动捕获它们。

答案 1 :(得分:0)

其他解决方案如何,我建议您观看名为YAML Configuration File的railscast。还有一些宝石,例如Settingslogic来帮助你。