2011-01-10 3 views
0

В моем приложении у меня много констант, поэтому я создал файл констант с именем det_constants.yml для этих констант.Проблема с константами

/config/det_constants.yml 

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

test: 
    <<: *DEFAULTS 

production: 
    <<: *DEFAULTS 

У меня есть файл constants.rb в папке lib, который загружает этот постоянный файл.

/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 

ответ

1

Я представляю вам нужно:

<% require 'constants' %> 

Кроме того, вам нужно будет перезапустить сервер следующие изменения в lib/; он не захватывает их автоматически даже в режиме разработки.

+0

Спасибо. Это сработало. –

+0

Я просто хотел знать, если это лучший способ сделать это. Есть ли лучший способ сделать это? –

+0

Ну, это не так * плохо * любым очевидным способом. Я вижу, что вам нравятся символы Ruby; обратите внимание, что они могут отображаться непосредственно в yaml, **: вещь: 123 ** как таковая. Также обратите внимание, что символы могут ограничивать потребность в шаблоне проектирования «enum», который вы реализуете. Рассмотрим очевидную альтернативу 'CONSTANTS :: Const1'. Мне нравится перегруженный оператор массива для констант, но я не уверен, что хочу оправдать мое использование его архитектору SW на моей дневной работе. :-) Я люблю «я». [] », Теперь у меня есть новое решение, которое я должен попробовать и подумать о проблеме. :-) – DigitalRoss

0

Что касается других решений, я рекомендую вам посмотреть railscast под названием YAML Configuration File. Есть также некоторые драгоценные камни, такие как Settingslogic, чтобы помочь вам в этом.