Безопасный способ инициализировать атрибуты из yaml или хеша - PullRequest
0 голосов
/ 08 марта 2012

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

Мой файл 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 ]

2 голосов
/ 08 марта 2012

Вам необходимо заключить в скобки ваше заявление if.

if options.respond_to?("has_key") && options.has_key?("defaults")
0 голосов
/ 08 марта 2012

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

  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

#...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...