web-dev-qa-db-ja.com

モンキーパッチを適用するときにコードを配置する場所

モンキーパッチについて私が読んだことはすべて、次のようなことをするように言っています。

class String
  def foo
    #your special code 
  end
end

しかし、このコードをどこに置くかについての指示は見つかりません。 Railsアプリで、これを好きな場所に置くことはできますか?モジュール内ですか?モデルですか?

モンキーパッチを定義するファイルに何かを含める必要がありますか?使用したい場所にモンキーパッチを含める必要がありますか?

8
Life4ants

これには決まったルールはありません。技術的には、どこでも開くことができます(クラス;メソッドを追加します)。私は通常、monkey_patches.rbという特別なファイルを作成し、それをconfig/initializersまたはRailsアプリのmiscフォルダーに置くので、競合が発生した場合は私はどこを見ればよいか知っています。

また、Moduleを使用してモンキーパッチをラップすることをお勧めします。詳細については、 混乱せずにモンキーパッチを適用する3つの方法 を確認してください。

彼の例:

module CoreExtensions
  module DateTime
    module BusinessDays
      def weekday?
        !sunday? && !saturday?
      end
    end
  end
end

DateTime.include CoreExtensions::DateTime::BusinessDays
12
virtuexru

Justin Weissが説明した次のテクニックを使用しました モンキーパッチを混乱させることなく3つの方法

たとえば、GemのVanilla Rubyでは、必要なファイルにモジュールを定義してから、 include(またはextend モジュールを目的のクラスに定義します。 。

module StringMonkeypatch
  def foo
    #your special code 
  end
end

String.include StringMonkeypatch

Rails)の場合、自動ロードされる場所(autoload_pathsを検索)で、Railsの命名規則に従う方法でモジュールを定義することをお勧めします。

たとえば、Sidekiq::Testing gemクラスにモンキーパッチを適用する場合は、ファイル構造をミラーリングする必要があります。

# in /app/<something telling>/sidekiq/testing/monkeypatch.rb
module Sidekiq::Testing::Monkeypatch
  def foo
    #your special code 
  end
end

# in /config/environment.rb, at the bootom
Sidekiq::Testing.include Sidekiq::Testing::Monkeypatch
1
Epigene

解決策がほとんどなかったので、これを理解するのに永遠に時間がかかったので、ただチャイムを鳴らしました。

•私は昔ながらのrequireを使わなければなりませんでした。 _config/application.rb_ファイルに入れました。一部の人が示唆しているように、ファイルをアプリディレクトリに置いても、ファイルは自動的に読み込まれません。理由はわかりません。

patching_file_path = File.expand_path("./lib", Dir.pwd) Dir[patching_file_path+'/*.rb'].each {|file| require file }

•また、要求しようとしているファイルに一時的な_puts "I'm Working!_を入れて、コンソールをチェックして実際にロードされているかどうかを確認できるようにします。

•また、Spring Loaderを使用している場合は、コンソールを起動する前に、Railsコンソールを起動する前にターミナルで_bin/spring stop_を実行する必要があります。そうしないとロードされません。新しいファイル。

0
stephennelson