3

モデルを使用して Gem を作成し (実際には、メイン プロジェクトから抽出しました)、プラットフォーム内のプロジェクト間で共有しました。

何十ものモデルがあるので、1 つずつ要求する代わりに、次のコードを書きました。

Gem.find_files("my_gem/models/*.rb").each { |path| require path }

gem ファイルに my_gem があるプロジェクトの 1 つにアクセスして実行するrails cと、次の出力が得られます。

/Users/myuser/.rvm/gems/ruby-1.9.3-p194/gems/activerecord-3.2.8/lib/active_record/dynamic_matchers.rb:50:in `method_missing': undefined method `has_attached_file' for #<Class:0x007fad4b93ccb8> (NoMethodError)

私のモデルの1つは宝石のペーパークリップを使用していますが、奇妙なのは次のとおりです。

  1. 上記で宣言された行を削除してすべてのモデルを自動的にロードすると、正常にrails c 実行されます
  2. ペーパークリップを使用するモデルのみを含めようとするとrequire "my_gem/models/paperclip_model"、同じエラーが表示されます

そこで、モデルをロードしないように gem を変更し、Rails コンソールからモデルを参照しようとすると、クラスがロードされていないと表示されますが、実行するGem.find_files("my_gem/models/*.rb").each { |path| require path }か、require "my_gem/models/paperclip_model"「完全に機能し、モデルを操作できます」 .

同じ問題を見た人はいますか?

4

2 に答える 2

3

変更することで問題requireautoload解決したようです

私が変更されGem.find_files("my_gem/models/*.rb").each { |path| require path }

為に

Gem.find_files("my_gem/models/*.rb").each do |f| 
  filename = File.basename(f, '.*')
  class_name_symbol = filename.classify.to_sym
  autoload class_name_symbol, "my_gem/models/#{filename}"
end

そして今それは働いています。

于 2012-11-13T11:15:03.147 に答える
0

gem のモデルの 1 つが Paperclip に依存しているようですが、依存関係として明示的に設定していません。つまり、ペーパークリップが読み込まれる前にUndefinedMethodモデルが読み込まれると、 のエラーが表示されhas_attached_fileます。

依存関係としてペーパークリップを持つ Rails アプリケーションでモデルを使用し、コンソール (またはサーバー) が起動したにそれらのモデルをロードすると、ペーパークリップが存在するため、このエラーは表示されません。

解決策は、次のように、gemspec に依存関係として paperclip を明示的に追加することです。

s.add_dependency('paperclip') 

この gem が Rails アプリケーションのコンテキストで常に使用されると仮定すると、これは機能するはずです。そうでない場合は、ペーパークリップを使用するモデルの先頭に次の行を追加する必要がある場合もあります

require "paperclip"
于 2012-11-12T18:55:04.393 に答える