将`cache_classes`设置为`false`修复了我的错误。接下来做什么?

时间:2011-10-26 16:16:11

标签: ruby-on-rails namespaces production-environment rails-engines name-conflict

我在我的rails应用程序中添加了一个可安装的引擎,它提供了类似论坛的功能(即添加问题,答案,评论等)。一切都在开发中运作良好。但是,在暂存/生产中,我在尝试创建答案时遇到错误,特别是CanCan权限错误(尽管我认为这可能是一个红色的鲱鱼)。但感觉ti可能与命名空间或名称冲突有关?

无论如何,当我在我的环境配置文件中设置config.cache_classes = false时,问题就消失了。但这不是一个可接受的解决方案,因为它确实减慢了事情。

我从哪里开始?我怎样才能确定哪些类需要重新加载?处理这个问题的常规方法是什么?

我正在使用Rails 3.1。

1 个答案:

答案 0 :(得分:3)

我弄明白了这个问题。这是启动顺序的问题。我Engine::AnswersController之前已加载Engine::ApplicationController。在我的代码中,我继承了ApplicationController。这意味着,由于Engine::AnswerController不了解Engine::ApplicationController,因此它错误地继承自主应用的ApplicationController而不是引擎的ApplicationController

修复是通过使引擎命名空间显式来强制应答控制器继承引擎而不是主应用程序:

Engine::AnswersController < Engine::ApplicationController

我理解这个问题对我的应用程序来说相当特殊,但我如何找到解决方案可能对其他人有所帮助。如果您遇到此类问题,请下载到某种类型的调试器(我使用Pry)并开始检查。具体来说,检查加载了哪些类并仔细查看继承链(即Engine::ApplicationController.ancestors)。寻找任何看似奇怪的东西。

此外,如果问题与引擎相关,您可能需要在引擎和主应用程序中放置调试器。调试引擎可能很困难,因为引擎中发生的错误可能不一定会冒泡到主应用程序。

非常感谢tjbladez帮助我解决这个问题。