2012-03-08 1 views
0

В моем методе инициализации я пытаюсь записать его, чтобы я мог передать либо хэш, либо объект yaml для инициализации значений атрибута.Безопасный способ инициализации атрибутов из yaml или hash

Мой файл YAML выглядит следующим образом:

defaults: &defaults 
    host: localhost 
    port: 4565 
    timeout: 3 


development: 
    <<: *defaults 

test: 
    <<: *defaults 

staging: 
    <<: *defaults 

production: 
    <<: *defaults 

настоящее время у меня это:

def initialize(options) 

    if options.respond_to? "has_key" && options.has_key? "defaults" 
    config = options["defaults"] 
    else 
    config = options 
    end 

    @hostname = config[:hostname] 
    @port = config[:port] 
    @timeout = config[:timeout] 

end 

Это в настоящее время не работает для меня, я получаю эту ошибку:

unexpected tSTRING_BEG, expecting keyword_then or ';' or '\n' 
     if options.respond_to? "has_key" && options.has_key? "defaults" 
  1. Как я могу загрузить правильную среду? (тест, разработка, производство)
  2. Как я могу сделать ошибку, если один из ключей отсутствует? (или, по крайней мере, основные из них, которые мне нужны, например, имя хоста, порт)

ответ

2

Вам необходимо скопировать инструкцию if.

if options.respond_to?("has_key") && options.has_key?("defaults") 
+0

пробелы, похоже, тоже важны? смущенный, не ожидал этого! – Blankman

0

Почему у вас есть следующий код?

if options.respond_to? "has_key" && options.has_key? "defaults" 
    config = options["defaults"] 
    else 
    config = options 
    end 

Файл YAML структурирована таким образом, что все четыре группы (разработка, тестирование, постановка, производство) будет иметь ключи по умолчанию, они не будут вложены в default ключа. Это в основном эквивалентно этому:

development: 
    host: localhost 
    port: 4565 
    timeout: 3 

test: 
    host: localhost 
    port: 4565 
    timeout: 3 

#... 
+0

Я вижу дефолт по-моему. – Blankman

+0

Я предполагаю, что вы передаете yaml [: development] в качестве параметров, в этом хеше не будет: ключ по умолчанию. –

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