2009-05-24 13 views
10

Soy nuevo a los rieles y no puedo entender este tema ...Ruby on Rails modelo de espacio de nombres en el interior no se puede encontrar en el controlador

Tengo un controlador

Admin::Blog::EntriesController 

definido en app/controllers/admin/blog/entries_controller.rb

y tengo un modelo llamado

Blog::Entry 

defin ed en app/modelo/blog/entry.rb

Cuando intento acceder a mi modelo del controlador, aparece un "uninitialized constant Admin::Blog::EntriesController::Blog" de esta línea:

@blog_entries = Blog::Entry.find(:all) 

Está claro que no es encontrar el espacio de nombres correctamente qué es extraño porque de acuerdo con lo que he leído, he colocado mi modelo en la carpeta correcta con la sintaxis correcta.

¿Alguna idea sobre cómo puedo solucionar esto?

Gracias

Respuesta

27

Probar:

@blog_entries = ::Blog::Entry.find(:all) 

Se ve actualmente para la clase equivocada. El uso de :: antes de Blog lo forzará a verse desde el nivel superior.

+0

Ah, gracias, eso funcionó. Sin embargo, resulta que también tengo que establecer un nombre de tabla personalizado para mi modelo. Además, el form_for helper no funciona porque utiliza el elemento " _path" para el atributo de acción, por lo que arroja un error que no puede encontrar el método "blog_entries_path" ... ¿Alguna idea? – nlaq

+0

Estoy empezando a pensar que los rieles fruncen el ceño ante múltiples espacios de nombres para modelos y controladores ... Lo cual es una lástima porque me gusta mucho la estructura de ruta

//. – nlaq

+0

la convención de los rieles es que los nombres de modelo son singulares, mientras que los controladores son plurales.Tal vez cambie el nombre del controlador Admins :: Blogs :: EntriesController (sí, parece extraño) Quizás también deba replantearse el uso de modelos con espacios de nombres, probablemente sean más problemas de los que merecen, consulte http://stackoverflow.com/questions/601768/namespaced-models-in-rails-whats-the-state-of-the-union – levinalex

1

se puede lograr un nombre de tabla personalizado utilizando

set_table_name('foo') 

en la parte superior de su modelo.

En cuanto a los múltiples espacios de nombres, que puede ser capaz de salir con el uso

polymorphic_path(@the_object) 

para generar sus URL como lo hace la inferencia más básica (en mi experiencia al menos, tal vez form_for lo utiliza bajo el capó) .

0

Sí, al mirar el código form_for utiliza el camino polimórfico debajo del capó.

3

Ahora es 2011 y estamos en el territorio de Rails 3.1, pero este problema aún se plantea. Acabo de encontrarlo con un controlador de espacio de nombres que hace referencia a un modelo sin espacio de nombres, , ¡pero solo cuando no había filas para ese modelo en la base de datos!

Prefijo del modelo con :: soluciona el problema.

+0

Se estaba ejecutando esto con algunas pruebas en Rails 4. La creación de un accesorio yml vacío para el modelo lo arregló, pero el problema subyacente era de hecho * tiene un espacio de nombres del mismo nombre que un modelo *. – Sooie

Cuestiones relacionadas