Установка `cache_classes` в` false` исправляет мою ошибку. Что делать дальше? - PullRequest
0 голосов
/ 26 октября 2011

Я добавляю монтируемый движок в мое приложение rails, которое обеспечивает функциональность, подобную форуму (т.е. добавляет вопросы, ответы, комментарии и т. Д.). Все отлично работает в разработке. Однако при постановке / производстве я получаю сообщение об ошибке при попытке создать ответ, в частности об ошибке разрешения CanCan (хотя я думаю, что это может быть красная сельдь). Но кажется, что это может быть связано с пространством имен или конфликтом имен?

В любом случае, проблема исчезнет, ​​если я установлю config.cache_classes = false в моем файле конфигурации среды. Но это неприемлемое решение, так как оно действительно тормозит.

Куда мне идти отсюда? Как я могу определить, какие классы нужно перезагрузить? Какой традиционный способ решения этой проблемы?

Я использую Rails 3.1.

1 Ответ

3 голосов
/ 26 октября 2011

Я разобрался в проблеме. Это была проблема с порядком загрузки. Мой Engine::AnswersController загружался до моего Engine::ApplicationController. И в моем коде я наследовал только от ApplicationController. Это означает, что, поскольку Engine::AnswerController не знал о Engine::ApplicationController, он ошибочно наследовал от ApplicationController основного приложения, а не от ApplicationController движка.

Исправление состояло в том, чтобы заставить контроллер ответов наследовать от движка, а не от основного приложения, сделав пространство имен движка явным:

Engine::AnswersController < Engine::ApplicationController

Я понимаю, что эта проблема довольно своеобразна для моего приложения, но то, как я пришел к решению, может быть полезным для других. Если вы столкнулись с проблемой такого типа, перейдите в какой-либо тип отладчика (я использовал Pry ) и начните проверять вещи. В частности, проверьте, какие классы загружены, и внимательно посмотрите на цепочку наследования (т. Е. Engine::ApplicationController.ancestors). Ищите все, что кажется странным.

Также, если проблема связана с движком, вам может потребоваться разместить отладчики как в движке, так и в основном приложении. Механизмы отладки могут быть трудными, поскольку ошибки, возникающие в механизме, могут не обязательно отображаться в главном приложении.

Большое спасибо tjbladez за помощь в выяснении этого.

...