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