0

私は宝石を持っています:

# in /Library/Ruby/Gems/1.8/gems/my_gem-1.0.0/lib/my_gem.rb
module MyGem
  def do_stuff
    ..
  end
end

そして私はそれをRailsにロードしました:

# in [rails_root]/config/environment.rb:
config.gem 'my_gem', :version => '1.0.0'

そしてそれを使用しました:

# in [rails_root]/app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  include MyGem
end

しかし、環境固有の方法で少しモンキーパッチを適用する必要があります。

# in [rails_root]/config/environments/development.rb:
MyGem.class_eval do
  def do_stuff
    raise 'Ack! - just testing'
  end
end

残念ながら、MyGemリクエストごとにリロードするので、私のモンキーパッチは役に立ちません。

私はチェックしましたload_once_paths

ActiveSupport::Dependencies.load_once_paths
# => ["/Library/Ruby/Gems/1.8/gems/my_gem-1.0.0/lib", "other stuff"]

どうすれば私が望む効果を得ることができるか考えていますか?

4

2 に答える 2

3

Railsがすべてのリクエストですべてのクラスをロードして開発者がコードの変更を反映できるようにする開発モードで作業しているようです+コントローラーにgemを含めました。これを克服するには、project_path / config / environment / development.rbに移動し、この行を追加します

config.cache_classes = true 

サーバーを再起動しない限り、コードの変更は反映されないことに注意してください。

アップデート1:2番目の解決策として、そのコントローラーにgemを組み込んだ後、モネキーパッチを追加することもできます。コントローラファイルの最後に追加できます。

アップデート2:3番目の解決策(推奨)次のスニペットをmy_gem.rbに追加できる場合

class ActionController::Base
  include MyGem
end

そうすれば、アプリケーションコントローラに手動で含める必要がなくなるため、問題なく機能するはずです。

于 2009-09-22T02:36:19.000 に答える
0

gem をenvironment.rbコントローラーに含める場合は、コントローラーに含める必要はありません。

gem がどのように ActionController にフックされるかを考えてみてください。クラス メソッドを ActionController::Base に追加したいように思えますが、これは非常に簡単です。これを実装している一般的な gem の数を見てみましょう。

RAILS_ENVの存在と値を確認して、環境ごとに異なる動作を保証することも必要なようです。

于 2009-07-23T00:11:39.403 に答える