Модель Ruby on Rails внутри пространства имен не может быть найдена в контроллере

Я новичок в рельсах и не могу понять эту проблему...

у меня есть контроллер

Admin::Blog::EntriesController

определено в app/controllers/admin/blog/entries_controller.rb

И у меня есть модель под названием

Blog::Entry

определено в app/model/blog/entry.rb

Когда я пытаюсь получить доступ к своей модели из контроллера, я получаю "uninitialized constant Admin::Blog::EntriesController::Blog" из этой строки:

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

Ясно, что он неправильно находит пространство имен, что странно, потому что, согласно тому, что я прочитал, я поместил свою модель в правильную папку с правильным синтаксисом.

Любые идеи о том, как я могу это исправить?

Спасибо


person Community    schedule 24.05.2009    source источник


Ответы (4)


Пытаться:

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

В настоящее время он ищет неправильный класс. Использование :: перед Blog заставит его смотреть с верхнего уровня.

person tomafro    schedule 24.05.2009
comment
А, спасибо, это сработало. Однако оказывается, что для моей модели я также должен установить собственное имя таблицы. Кроме того, помощник form_for не работает, так как он использует ‹model path›_path для атрибута действия, я думаю, поэтому он выдает ошибку, что не может найти метод blog_entries_path... Есть идеи? - person ; 24.05.2009
comment
Я начинаю думать, что рельсы не одобряют множественные пространства имен для моделей и контроллеров... Это позор, потому что мне очень нравится структура пути ‹section›/‹module›/‹model›. - person ; 24.05.2009
comment
соглашение rails заключается в том, что имена моделей в единственном числе, а имена контроллеров во множественном числе. Возможно, переименуйте контроллер в Admins::Blogs::EntriesController (да, это выглядит странно). Возможно, вам также следует переосмыслить использование моделей с пространством имен, они, вероятно, доставляют больше проблем, чем пользы, см. stackoverflow.com/questions/601768/< /а> - person levinalex; 01.06.2009
comment
Это также решает проблему, с которой я столкнулся при случайном дублировании имени класса, позже найденного в SDK. Класс моей модели начал разрешаться в пространство имен API в файлах, которые включали SDK, поэтому добавление :: впереди заставило его вернуться в основное пространство имен приложения, которое снова правильно разрешилось в мое имя класса. - person Daniel Nalbach; 03.01.2020

Сейчас 2011 год, и мы находимся на территории Rails 3.1, но эта проблема все еще возникает. Я только что столкнулся с этим, когда контроллер с пространством имен ссылается на модель без пространства имен, но только тогда, когда в базе данных нет строк для этой модели!

Префикс имени модели с :: устраняет проблему.

person turingtest37    schedule 27.09.2011
comment
Я столкнулся с этим во время некоторых тестов в Rails 4. Создание пустого фикстуры yml для модели устранило проблему, но основной проблемой было наличие пространства имен с тем же именем, что и у модели. - person Brian; 29.10.2015
comment
Можете ли вы поверить, что это 2018 год, и та же проблема все еще существует. :) Решил это, добавив к модели префикс ::. - person Yewness; 18.07.2018

Вы можете получить пользовательское имя таблицы, используя

set_table_name('foo')

в верхней части вашей модели.

Что касается нескольких пространств имен, вам может сойти с рук использование

polymorphic_path(@the_object)

для создания ваших URL-адресов, поскольку он делает более простой вывод (по крайней мере, по моему опыту, возможно, form_for использует его под капотом).

person Cody Caughlan    schedule 24.05.2009

Да, судя по коду, form_for использует polymorphic_path под капотом.

person Keith Pitt    schedule 19.01.2010