2014-11-20 2 views
0

Я унаследовал инструмент, который работает правильно, но когда я пытаюсь его расширить, он просто терпит неудачу. Так как я новичок в рубин и YAML я действительно не знаю, что является причиной, почему это не удается ...YAML Ruby Загрузить несколько переменных окружения

Так у меня есть класс конфигурации, который выглядит следующим

class Configuration 
    def self.[] key 
     @@config[key] 
    end 

    def self.load name 
     @@config = nil 
     io = File.open(File.dirname(__FILE__) + "/../../../config/config.yml") 
     YAML::load_documents(io) { |doc| @@config = doc[name] } 
     raise "Could not locate a configuration named \"#{name}\"" unless @@config 
    end 

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

    end 
end 

raise "Please set the A environment variable" unless ENV['A'] 
Helpers::Configuration.load(ENV['A']) 

raise "Please set the D environment variable" unless ENV['D'] 
Helpers::Configuration.load(ENV['D']) 

raise "Please set the P environment variable" unless ENV['P'] 
Helpers::Configuration.load(ENV['P']) 

Так что я был первый вариант с переменная окружения A, которая работала нормально, тогда, когда я хочу интегрировать еще 2 переменные среды, они терпят неудачу (это разные наборы ключей/значений). Я отлаживал его, и, похоже, когда он читает второй ключ/значение, он удаляет другие (например, чтение третьего удаляет предыдущие 2, поэтому я заканчиваю с @@ config только с третьим ключом/значением par вместо все значения, которые мне нужны).

Возможно, это легко исправить, любая идея как?

Спасибо!

EDIT: Использование файла конфигурации выглядеть следующим образом:

Test: 
    position_x: “56” 
    position_y: “56” 

Теперь я хочу, чтобы это сделать, как

“x56”: 
    position_x: “56” 

“x15”: 
    position_x: “15” 

“y56”: 
    position_y: “56” 

“y15”: 
    position_y: “15” 

Моя идея заключается в том, что я поставил их отдельно, и мне не нужно для создания всех комбинаций ...

+0

Не могли бы вы поделиться файлом 'config.yml'? На первый взгляд, похоже, что вы должны «@@ config = YAML :: load» вместо того, что вы там делаете. – mudasobwa

+0

Конечно, я хотел сделать это, забыл включить его.Его используют, чтобы быть Simples как это: Тест: position_x: «56» position_y: «56» Теперь я хочу, чтобы это сделать, как «X56»: position_x: «56» «x15 «: position_x:„15“ „y56“: position_y:„56“ „Y15“: position_y:„15“ Моя идея заключается в том, что я поставил их отдельно, и мне не нужно, чтобы создать все комбинации ... – yvuqld

+0

U pdate ваш пост, pls. – mudasobwa

ответ

0

Каждый раз, когда вы вызываете load, вы удаляете предыдущую конфигурацию (в строке @@config = nil). Если вы хотите, чтобы конфигурация была объединением всех файлов, вы захотите объединить новую конфигурацию с существующей конфигурацией, а не переопределять ее.

Что-то вроде этого:

def self.load name 
    @@config ||= {} 
    io = File.open(File.dirname(__FILE__) + "/../../../config/config.yml") 
    YAML::load_documents(io) do |doc| 
    raise "Could not locate a configuration named \"#{name}\"" unless doc[name] 
    @@config.merge!(doc[name]) 
    end 
end 

Имейте в виду, что если код был написан, как это было, потому что метод был назвать более чем один раз, а конфигурация ожидается сброса между чтениями, вам нужно будет явно сбросить конфигурацию в настоящее время:

class Configuration 

    # ... 

    def reset_configuration 
    @config = {} 
    end 
end 

Helpers::Configuration.reset_configuration 

raise "Please set the A environment variable" unless ENV['A'] 
Helpers::Configuration.load(ENV['A']) 

raise "Please set the D environment variable" unless ENV['D'] 
Helpers::Configuration.load(ENV['D']) 

raise "Please set the P environment variable" unless ENV['P'] 
Helpers::Configuration.load(ENV['P']) 
+0

Просто отлично, спасибо! Я снова подумал об этом, но даже удалив его, я не мог понять, как объединить их вместе! Большое спасибо. – yvuqld

0

Я бы получить доступ к YAML с помощью:

YAML::load_file(File.expand_path("../../../config/config.yml", File.dirname(__FILE__))) 

expand_path очищает цепь «..» и возвращает очищенную версию относительно FILE. Например:

foo = '/path/to/a/file' 
File.expand_path("../config.yml", File.dirname(foo)) # => "/path/to/config.yml" 

load_file читает и анализирует весь файл и возвращает его.

Смежные вопросы