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

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

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

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

我从这里去哪里?如何确定需要重新加载哪些类?处理这个问题的传统方法是什么?

我正在使用 Rails 3.1。

最佳答案

我解决了这个问题。这是引导顺序的问题。我的 Engine::AnswersController在我的 Engine::ApplicationController 之前被加载.在我的代码中,我只是继承自 ApplicationController .这意味着,由于 Engine::AnswerController不知道Engine::ApplicationController它错误地继承自主应用程序的 ApplicationController而不是引擎的 ApplicationController .

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

Engine::AnswersController < Engine::ApplicationController

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

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

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

关于ruby-on-rails - 将 `cache_classes` 设置为 `false` 修复了我的错误。接下来做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7905618/

相关文章:

css - Rails 中适当的 SCSS Assets 结构

c++ - C++ 中的命名空间和包装

debugging - VB6 中的运行时错误堆栈跟踪或位置

vb.net - 从头开始创建企业 .Net 命名空间框架的最佳方法是什么?

Python 命名空间包作为现有包的扩展

npm - Electron 可以选择在生产构建应用程序上加载 `electron-debug`

objective-c - 生产环境不花钱内购测试

ruby-on-rails - 是否有更干的方法根据 Rails 中的路由动态添加类?

sql - 使用动态查找器指定 NOT NULL

java - 如何使用暂停/恢复支持上传到 S3?