Константы движка Rails

У меня есть движок Rails с последними версиями rails и ruby.

У меня есть контроллер cms с действием update. Я использую это действие обновления для обновления разных таблиц. Например, у меня есть таблица с названием settings. Этот метод отлично работает в обычном приложении Rails, но в моем движке Rails он выдает эту ошибку:

NameError (uninitialized constant Setting):

У меня есть модель под названием Setting, почему мне выдается ошибка?


person jakobk    schedule 12.10.2012    source источник
comment
Где находится модель настройки в файловой системе?   -  person Simon Perepelitsa    schedule 12.10.2012
comment
это в движке, так что должно работать   -  person jakobk    schedule 12.10.2012
comment
Нет, в каком файле он находится? Путь важен для автозагрузки.   -  person Simon Perepelitsa    schedule 12.10.2012
comment
файл settings.rb находится здесь: models/cms/setting.rb — это то, что вы имеете в виду?   -  person jakobk    schedule 12.10.2012
comment
Да, это приложение/модели или только модели?   -  person Simon Perepelitsa    schedule 12.10.2012
comment
это внутри root/app/models/cms/setting.rb   -  person jakobk    schedule 12.10.2012


Ответы (1)


Именование файлов важно для работы автозагрузки. Соглашение об именах одинаково как в приложениях, так и в движках. По сути, приложение является движком.

Итак, my_rails_app/app/models/cms/setting.rb эквивалентно my_engine/app/models/cms/setting.rb

Если у вас все еще есть проблемы, попробуйте получить доступ к константе с явным пространством имен Cms::Setting.

Вы можете динамически получить константу из соответствующего пространства имен, выполнив

Cms.const_get(table.capitalize)

Однако будьте осторожны с этим подходом, поскольку хакер может отправить вам что угодно и, следовательно, получить доступ к любой константе.

person Simon Perepelitsa    schedule 12.10.2012
comment
Спасибо, я и так работал нормально, проблема была не в модели, но это не работало внутри движка: table.capitalize.constantize, который я использую, чтобы обновлять разные таблицы из jquery. Это будет означать настройку как константа, но я думаю, что это нуждается в пространстве имен двигателя - person jakobk; 12.10.2012
comment
Обновленный ответ. Constantize не будет работать, потому что он получает константы из глобального пространства имен. - person Simon Perepelitsa; 12.10.2012
comment
Потрясающий! - Работает.. спасибо. Да, я буду использовать белый список... ) - person jakobk; 12.10.2012