2011-01-10 5 views
0

私のアプリでは多くの定数があるので、これらの定数のdet_constants.ymlという名前の定数ファイルを作成しました。定数の問題

/config/det_constants.yml 

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

test: 
    <<: *DEFAULTS 

production: 
    <<: *DEFAULTS 

この定数ファイルをロードするlibフォルダにconstants.rbファイルがあります。私はそれは、

<%= Constants[:company_type] %> 

しかし行でエラー

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

をスロー

<%= Constants[:company_type] %> 

行う私のビューファイルで

/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 

、私は同じことを行う場合コンソールでは正常に動作します。

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 

答えて

1

が必要です

<% require 'constants' %> 

また、あなたがlib/の変化以下のサーバーを再起動する必要があります。開発モードでも自動的にキャッチしません。

+0

ありがとうございました。出来た。 –

+0

これを行うにはこれが最善の方法かどうかを知りたかっただけです。これを行うより良い方法はありますか? –

+0

まあ、それは明らかな方法で*悪い*ではありません。私はあなたがルビーのシンボルが好きだと分かります。それらがそのままyaml、**:thing:123 **にそのまま現れることに注意してください。シンボルは、実装している 'enum'デザインパターンの必要性を制限するかもしれないことにも注意してください。 'CONSTANTS :: Const1'の明白な代替案を考えてみましょう。私は定数のオーバーロードされた配列演算子が大好きですが、私の仕事でSWアーキテクトに私の使用を正当化したいとは思っていません。私は自分自身が大好きです:今、私は新しい解決策を持っています。 :-) – DigitalRoss

0

他の解決方法については、YAML Configuration Fileと呼ばれるレールキャストを視聴することをおすすめします。あなたを助けるために、Settingslogicのような宝石もあります。