2011-08-13 32 views
12

Skrócona wersja (dla tych, którzy znają Mongoid & Sinatra): Jeśli to niePsyche/Syck YAML-parsowania emisyjnej, dlaczego inny mógłbym dostać ten błąd, gdy próbuje połączyć się z bazą danych MongoDB wykorzystaniem Mongoid? (A może to jest że kwestia, w tym przypadku, jak to naprawić mój plik mongoid.yml, pisał poniżej?)Dlaczego pojawia się błąd "nazwa_bazy_danych musi być ciągiem lub symbolem"?


Bardziej szczegółowe (oryginalna) wersja:

mam app Sinatra interakcji z bazy danych MongoDB poprzez Mongoid:

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

a mój plik mongoid.yml wygląda następująco:

development: 
    host: localhost 
    database: project_development 

test: 
    host: localhost 
    database: project_test 

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

Ilekroć próbuję wejść w interakcję z bazą danych w jakiś sposób, pojawia się błąd db_name musi być ciągiem lub symbolem.

Teraz znalazłem mnóstwo informacji o Google na ten temat; ale wszystko, co mogę znaleźć, zdaje się wskazywać, że problem związany jest z Ruby teraz, używając parsera Psyche YAML zamiast starego parsera Syck. Nie sądzę, że jest to istotne w moim przypadku, ponieważ, o ile wiem, powyższy YAML powinien być doskonale parsable przez którąkolwiek z nich.

(.. Na co warto, choć ja mieć próbował pomocą YAML::ENGINE.yamler= 'syck' sztuczkę, bezskutecznie mam dokładnie ten sam komunikat o błędzie)

Kiedy zmienić konfigurację do tego:

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

... wtedy wszystko działa poprawnie. Więc wiem, że MongoDB pracuje na mojej maszynie. Dzieje się tak zwłaszcza wtedy, gdy używam pliku YAML, że sprawy idą nie tak.

Co daje?

+1

Czy upewniłeś się, że 'ENV ['RACK_ENV']' jest ustawione poprawnie, ponieważ to właśnie używa 'Mongoid.load!', Jeśli nie znajdzie 'Railsów.env' – rubish

+0

@Rubish: Próbowałem użyć 'set: environment,: development' using Sinatra; to powinno być zrobione, prawda? –

+0

@Rubish: Wow, pokoloruj mnie oszołomiony! Zmieniłem kod z 'set: environment' na jawnie ustawiający' ENV ['RACK_ENV'] 'i zadziałało! Co powiesz na zmianę tego komentarza na odpowiedź, abyś mógł zdobyć punkty rep? ;) –

Odpowiedz

10

Upewnij się, że ENV['RACK_ENV'] jest ustawiony prawidłowo, ponieważ tak właśnie jest używany Mongoid.load!, jeśli nie znajdzie Rails.env.

0

miałem ten sam problem z szyn i rozwiązać go w ten sposób:

Problem tkwi w różnych oczekiwań Mongoid i MongodbLogger dotyczących struktury mongoid.yml. Krótki: wystarczy dodać do bazy danych dodatkowo na górnym poziomie:

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 

Zaletą jest to, że można korzystać z bazy danych do swoich danych, a drugi dla rejestratora. Dane techniczne Istnieją dwa niezależne systemy wykorzystujące moduł yml: logger i MongoId.

Powiązane problemy