我有点困惑...我的服务器从 2.1.1 升级到 2.3.2,当我的混合集群尝试启动时出现以下错误:
Exception `Gem::LoadError' at /usr/lib/ruby/site_ruby/1.8/rubygems.rb:578 - Could not find RubyGem activerecord-mysql-adapter (>= 0)
这是什么原因造成的?我做过以下事情:
gem install mysql
...使用各种特定于路径的魔法来安装它。谷歌搜索发现了一些类似的问题,但没有明显的解决办法。有什么想法吗?
更多信息:
版本:Rails 2.3.2(通过gem
)、RubyGems 1.3.4(通过gem
)、Ruby 1.8.5(通过yum
)、Linux 2.6.18-xen(CentOS 5.2)。
MySQL 适配器(gem install mysql
)是 2.7。
奇怪的是,如果我删除 mysql 适配器 ( gem uninstall mysql
),我希望它会恢复为内置 (虽然很慢...?) MySQL 适配器。它的行为没有任何不同。
答案1
造成这种情况的根本原因是 Rails 2.3 允许外部 gem 提供连接适配器,而不是将它们全部捆绑在一起。activerecord-2.3.2/lib/active_record/connection_adapters/abstract/connection_specification.rb
如果您感兴趣,可以查看详细信息,但简而言之,establish_connection 将尝试执行的第一件事是加载 gem,如果失败,则执行“传统”的 require(将加载内置的 mysql 适配器)。
通过引发 来表示“失败” LoadError
,这就是事情变得烦人的地方。Rubygems 有自己的LoadError
类 ( Gem::LoadError
),我思考问题就出在这里,因为 activerecord 没有正确检测到(预期的)故障已经发生,所以导致崩溃,而不是仅仅尝试在本地加载连接适配器。
您将来可能会后悔做的一个愚蠢的事情是将activerecord-2.3.2/lib/active_record/connection_adapters/abstract/connection_specification.rb
第 72 行更改为:
rescue LoadError, Gem::LoadError
修复此问题的正确方法是找出环境中导致此问题的原因(因为显然不是每个人都会遇到此问题)。我的第一个猜测是您正在运行旧版本的 RubyGems(例如,版本 1.3.3 中的 rubygems.rb 的第 578 行与加载错误无关),或者运行奇怪的(可能已过期的)Ruby 版本。我会确保您正在运行最新的 Rubygems(Rails 2.3 至少需要 1.3.1 才能正常运行,我想这可能是您遇到的问题),并且您的 Ruby 版本不是太过分(使用 1.8.6 或 1.8.7,并且我会谨慎使用 1.9 版本)。
如果所有操作均正常但问题仍然存在,请提供系统的完整详细信息(操作系统、发行版、Ruby/rubygems 的来源(软件包、源代码等)、以上所有内容的版本、任何自定义),然后有人可以彻底解决问题。就目前而言,您没有提供任何可帮助任何人追踪问题的信息。