我正在使用 system() 从 rails 调用外部脚本,我得到了这个:
/home/user/.rvm/gems/ruby-1.9.2-p180/gems/activerecord-
3.0.7/lib/active_record/connection_adapters/mysql_adapter.rb:22:in
`rescue in mysql_connection': !!! Missing the mysql2 gem. Add it to
your Gemfile: gem 'mysql2' (RuntimeError)
...
此错误是由外部脚本引起的,该脚本在没有导轨的情况下加载 rubygems 和活动记录。如果我指定使用相同版本的 mysql2 rails,该脚本仍然可以在 shell 中运行:
require 'rubygems'
gem 'mysql2', '0.2.7'
require 'active_record'
...#active record initialization
c = Class.new # Class uses rails models
c.run
我还可以使用脚本在 rails 中使用的类。这意味着我可以在剥离 active_record 初始化后使用 rake运行脚本。但是,最好先知道是什么原因造成的。
编辑。除非我取消注释 require 'active_record',否则使用 bundle exec 运行脚本会引发相同的错误。在这种情况下,当我调用模型时,我会留下 NameErrors。
编辑2。通过区分“gem list”和“bundle exec gem list”并删除比 bundler 版本更新的 gem 版本来修复。在没有 bundle exec 的情况下运行也仍然有效,这是我没想到的。在 Gemfile 中,我需要 rails 3.0.7,但也安装了 3.1.0.beta1 版本的 activerecord。看起来 bundle exec 忽略了 rails 版本并加载了最新版本的 activerecord。也许将 gem 'activerecord', '3.0.7' 添加到外部脚本或 gemfile 也可以解决这个问题。