我正在为我的rails应用程序添加一个可安装的引擎,它提供了一个类似论坛的功能(即添加问题,答案,评论等)。在开发过程中一切都很顺利。然而,在登台/生产,我得到一个错误时,试图创建一个答案,特别是一个CanCan权限错误(虽然我认为这可能是一个转移注意力)。但感觉这可能与名称空间或名称冲突有关?
无论如何,当我在环境配置文件中设置config.cache_classes = false
时,这个问题就消失了。但这不是一个可接受的解决方案,因为它确实减慢了速度。
我该往哪里走?我怎样才能知道哪些类需要重新加载?处理这个问题的传统方法是什么?
我使用的是Rails 3.1
我找到了问题所在。这是启动顺序的问题。Engine::AnswersController
在Engine::ApplicationController
之前加载。在我的代码中,我只继承了ApplicationController
。这意味着,由于Engine::AnswerController
不知道Engine::ApplicationController
,它错误地继承了主应用程序的ApplicationController
而不是引擎的ApplicationController
。
修复方法是通过显式设置引擎命名空间来强制answers控制器继承引擎而不是主应用:
Engine::AnswersController < Engine::ApplicationController
我知道这个问题对我的应用程序来说是相当特殊的,但是我如何得到解决方案可能对其他人有帮助。如果您面临这种类型的问题,请下拉到某种类型的调试器(我使用的是Pry)并开始检查。具体来说,检查加载了哪些类,并仔细查看继承链(即Engine::ApplicationController.ancestors
)。寻找任何看起来奇怪的东西
如果问题与引擎相关,你可能需要在引擎和主应用中同时放置调试器。调试引擎可能很困难,因为引擎中发生的错误不一定会出现在主应用中。
非常感谢tjbladez帮我解决这个问题。