Установка `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 за помощь в этом.

Другие вопросы по тегам