Установка `cache_classes` в`false` исправляет мою ошибку. Что делать дальше?
Я добавляю в мое приложение rails монтируемый движок, который обеспечивает функциональность, подобную форуму (т.е. добавляет вопросы, ответы, комментарии и т. Д.). Все отлично работает в разработке. Однако при постановке / производстве я получаю сообщение об ошибке при попытке создать ответ, в частности об ошибке разрешения CanCan (хотя я думаю, что это может быть красная сельдь). Но кажется, что это может быть связано с пространством имен или конфликтом имен?
В любом случае, проблема уходит, когда я устанавливаю config.cache_classes = false
в моем файле конфигурации среды. Но это не приемлемое решение, так как оно действительно замедляет процесс.
Куда мне идти отсюда? Как я могу определить, какие классы нужно перезагрузить? Какой обычный способ справиться с этой проблемой?
Я использую Rails 3.1.
1 ответ
Я понял проблему. Это была проблема с порядком загрузки. мой Engine::AnswersController
загружался до моего Engine::ApplicationController
, И в моем коде я унаследовал от просто ApplicationController
, Это означает, что с Engine::AnswerController
не знал о Engine::ApplicationController
это было ошибочно унаследовано от основного приложения ApplicationController
а не двигатель ApplicationController
,
Исправление состояло в том, чтобы заставить контроллер ответов наследовать от движка, а не от основного приложения, сделав пространство имен движка явным:
Engine::AnswersController < Engine::ApplicationController
Я понимаю, что эта проблема довольно своеобразна для моего приложения, но то, как я пришел к решению, может быть полезным для других. Если вы столкнулись с проблемой такого типа, перейдите в какой-либо тип отладчика (я использовал Pry) и начните проверять вещи. В частности, проверьте, какие классы загружены, и внимательно посмотрите на цепочку наследования (т.е. Engine::ApplicationController.ancestors
). Ищите все, что кажется странным.
Также, если проблема связана с движком, вам может потребоваться разместить отладчики как в движке, так и в основном приложении. Механизмы отладки могут быть трудными, так как ошибки, возникающие в механизме, могут не обязательно попадать в основное приложение.
Большое спасибо tjbladez за помощь в этом.