2011-08-13 12 views
12

versión rápida (para quienes están familiarizados con Mongoid & Sinatra): Si se trata de no el tema YAML-análisis Psyche/Syck, ¿por qué demás podría yo conseguir este error cuando intenta conectarse a una base de datos MongoDB usando Mongoid? (O tal vez es esa cuestión, en cuyo caso, ¿cómo puedo solucionar mi archivo mongoid.yml, publican a continuación?)¿Por qué me aparece el error "db_name debe ser una cadena o símbolo"?


más detallada (original) versión:

tengo una aplicación Sinatra interactuar con una base de datos MongoDB través Mongoid:

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

Y mi archivo mongoid.yml se ve así:

development: 
    host: localhost 
    database: project_development 

test: 
    host: localhost 
    database: project_test 

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

Cada vez que trato de interactuar con la base de datos de alguna manera, obtengo el error db_name debe ser una cadena o símbolo.

Ahora, he encontrado mucho de información en Google sobre esto; pero todo lo que puedo encontrar parece indicar que el problema tiene que ver con Ruby ahora que usa el analizador Psyche YAML en lugar del viejo analizador de Syck. No creo que eso sea relevante en mi caso porque, por lo que puedo decir, el YAML anterior debería ser perfectamente analizable por cualquiera de los dos.

(.. Por lo que vale la pena, sin embargo, me tengo intentado usar el truco YAML::ENGINE.yamler= 'syck', en vano me dieron el mismo mensaje de error exacto)

cuando cambio la configuración para esto:

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

... todo funciona bien. Entonces sé que MongoDB está trabajando en mi máquina. Es específicamente cuando uso un archivo YAML que las cosas salen mal.

¿Qué ofrece?

+1

¿Se aseguró de que 'ENV ['RACK_ENV']' esté configurado correctamente, ya que eso es lo que 'Mongoid.load!' Usa si no encuentra 'Rails.env' – rubish

+0

@Rubish: Intenté usar 'set: environment,: development' usando Sinatra; eso debería haberlo hecho, ¿verdad? –

+0

@Rubish: ¡Wow, coloreame aturdido! Cambié mi código de 'set: environment' a configuración' ENV ['RACK_ENV'] 'explícitamente, ¡y funcionó! ¿Qué tal si conviertes ese comentario en una respuesta, para que puedas obtener algunos puntos de representante? ;) –

Respuesta

10

Asegúrese de que ENV['RACK_ENV'] esté configurado correctamente, ya que eso es lo que usa Mongoid.load! si no encuentra Rails.env.

0

tuve el mismo problema con los carriles y lo resolvió de esta manera:

el problema radica en los diferentes expectativas de Mongoid y MongodbLogger relativas a la estructura de la mongoid.yml. corta: sólo tiene que añadir la base de datos, además de en el nivel superior:

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 

La ventaja es que se puede utilizar una base de datos para los datos y otro para el registrador. Técnica Hay dos sistemas independientes que usan el yml: el registrador y MongoId.

Cuestiones relacionadas