Почему я получаю сообщение об ошибке «db_name должно быть строкой или символом»? - PullRequest
12 голосов
/ 13 августа 2011

Быстрая версия (для тех, кто знаком с Монгоид & Синатра ) : если это не Психея / Syck Проблема с YAML-анализом, почему else может появиться эта ошибка при попытке подключения к базе данных MongoDB с использованием Mongoid? (Или, может быть, является этой проблемой, в таком случае, как мне исправить мой файл mongoid.yml, опубликованный ниже?)


Более подробная (оригинальная) версия :

У меня есть приложение Sinatra, взаимодействующее с базой данных MongoDB через Mongoid:

configure do
    Mongoid.load!('config/mongoid.yml')
end

И мой файл mongoid.yml выглядит так:

development:
    host: localhost
    database: project_development

test:
    host: localhost
    database: project_test

production:
    uri: <%= ENV['MONGOLAB_URI'] %>

Всякий раз, когда я пытаюсь каким-либо образом взаимодействовать с базой данных, я получаю ошибку db_name должно быть строкой или символом .

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

(Впрочем, что бы это ни стоило, я уже пытался использовать трюк YAML::ENGINE.yamler= 'syck', но безрезультатно. Я получил точно такое же сообщение об ошибке.)

Когда я изменяю конфигурацию на это:

Mongoid.configure do |config|
    name = "project_development"
    host = "localhost"
    config.master = Mongo::Connection.new.db(name)
end

... тогда все работает нормально. Итак, я знаю, что MongoDB работает на моей машине. Именно когда я использую файл YAML, все идет не так, как надо.

Так что же дает?

Ответы [ 2 ]

10 голосов
/ 14 августа 2011

Убедитесь, что ENV['RACK_ENV'] установлено правильно, поскольку именно это Mongoid.load! использует, если не находит Rails.env.

0 голосов
/ 03 августа 2012

У меня была такая же проблема с рельсами, и я решил ее следующим образом:

Проблема заключается в разных ожиданиях Mongoid и MongodbLogger относительно структуры mongoid.yml.Коротко: просто добавьте базу данных дополнительно на верхнем уровне:

development:
  sessions:
    default:
      database: apollo_development                       <<<< for the rest
      hosts:
        - localhost:27017
      options:
        consistency: :strong
  database: apollo_development                           <<<<main level for logger
    .... more stuff for the logger

Преимущество состоит в том, что вы можете использовать базу данных для ваших данных и другую для регистратора.Техническая существует две независимые системы, использующие yml: logger и MongoId.

...