0

system() を使用してレールから外部スクリプトを呼び出すと、次のようになります。

/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 と同じバージョンを指定した場合、スクリプトは引き続きシェルから機能します。

require 'rubygems'
gem 'mysql2', '0.2.7'
require 'active_record'
...#active record initialization
c = Class.new # Class uses rails models
c.run

また、スクリプトがレール内で使用するクラスを使用することもできます。これは、active_record の初期化を取り除いた後、rake を使用してスクリプトを実行できることを意味します。ただし、最初に何が原因なのかを知っておくとよいでしょう。

編集。bundle exec を使用してスクリプトを実行すると、require 'active_record' のコメントを解除しない限り、同じエラーが発生します。この場合、モデルを呼び出すと NameErrors が残ります。

編集2。「gem list」と「bundle exec gem list」を比較し、バンドラーのバージョンよりも新しいバージョンの gem を削除することで修正されました。bundle exec なしで実行することもできますが、これは予想外でした。Gemfile では rails 3.0.7 が必要でしたが、activerecord の 3.1.0.beta1 バージョンもインストールされていました。bundle exec が Rails のバージョンを無視し、activerecord の最新バージョンをロードしているようです。おそらく、gem 'activerecord', '3.0.7' を外部スクリプトまたは gemfile に追加すると、この問題も修正されるでしょう。

4

1 に答える 1

0

RVM を使用しているため、バンドルと同じコンテキスト内で動作していない別の Ruby で実行している可能性があります。bundle execこのコマンドの実行に使用していることを確認してください。

于 2011-06-25T22:38:49.817 に答える