Я думаю, проблема в том, что проблема не очень изолирована.Вот пример стратегии его изоляции.
Код ошибки URI::InvalidURIError: bad URI(is not URI?):
указывает только на то, что библиотека (гем блейзера) успешно прочитала файл, который может или не может бытьфайл, который вы отредактировали, /YOUR_DIR/blazer.yml
или что-то еще, но, тем не менее, не удалось проанализировать URI.
Теперь необходимо рассмотреть следующие вопросы:
- blazer gem действительно прочитал
/YOUR_DIR/blazer.yml
? - работает ли препроцессор yml должным образом?
- Правильно ли указан ключ uri ?
mysql:
или mysql2
? - правильны ли форматы IP, порта, имени учетной записи, пароля и имени базы данных?В частности, правильно ли экранированы специальные символы?(См. MySql документ о специальных символах )
Я полагаю, что ОП знает ответы на некоторые из этих вопросов, но мы этого не делаем.Итак, давайте предположим, что любой из них может быть проблемой.
Тогда предложенная стратегия будет такой:
Найдите URI, который хотя бы в правильном формате, и подтвердитеон анализируется и корректно распознается Gem blazer.Обратите внимание, что вам нужно только проверить формат, поэтому фиктивные параметры в порядке.Например, попробуйте комбинацию следующего и посмотрите, что не выдает ошибку URI::InvalidURIError
:
mysql://127.0.0.1/test
mysql://adam:alphabetonly@127.0.0.1/test
jdbc:mysql://adam:alphabetonly@127.0.0.1/test
Теперь вы знаете, по крайней мере, потенциальные проблемы (1), (3), (4) не имеют значения.
- Замените IP (имя хоста), аккаунтимя, пароль и имя базы данных одно за другим с реальным и найдите, что вызывает ошибку
URI::InvalidURIError
.Теперь вы сузили, какая часть вызывает проблему.Я подозреваю, что в случае с OP проблема заключается в неправильном экранировании специальных символов в части пароля.Давайте предположим, что это так, а затем должным образом экранируют часть, чтобы они сформировали правильный формат URI в целом.Ответ @Schwern - хорошее резюме о формате.В качестве подсказки вы можете получить escape-URI, открыв консоль Rail (через rails c
) и набрав URI.encode('YOUR_PASSWORD')
или, альтернативно, запустив ruby непосредственно из командной строки в терминале (UNIX-shell):
ruby -ruri -e "puts URI.encode('YOUR_PASSWORD')"
Замените парольную часть в URI в /YOUR_DIR/blazer.yml
на экранированную строку и подтвердите, что она не выдает ошибку URI::InvalidURIError
(надеюсь).
При такой обработкеЯ сознательно избегал препроцессорной части (2). В этом ответе на "Rails не анализирует URL базы данных в рабочей среде" упоминается о URI.encode('YOUR_PASSWORD')
в файле yml, но это неявно предполагает, что препроцессор работает нормально.На этапе тестирования это просто добавляет еще один слой усложнения, и поэтому лучше его пропустить.Если вам нужно это в вашем производстве (чтобы замаскировать пароль и т. Д.), Внедрите его позже, когда вы будете знать, что все остальное работает нормально.
Надеюсь, что к тому времени, когда ОП попробует все это, проблема решена.