モンキーパッチについて私が読んだことはすべて、次のようなことをするように言っています。
class String
def foo
#your special code
end
end
しかし、このコードをどこに置くかについての指示は見つかりません。 Railsアプリで、これを好きな場所に置くことはできますか?モジュール内ですか?モデルですか?
モンキーパッチを定義するファイルに何かを含める必要がありますか?使用したい場所にモンキーパッチを含める必要がありますか?
これには決まったルールはありません。技術的には、どこでも開くことができます(クラス;メソッドを追加します)。私は通常、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
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
解決策がほとんどなかったので、これを理解するのに永遠に時間がかかったので、ただチャイムを鳴らしました。
•私は昔ながらの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
_を実行する必要があります。そうしないとロードされません。新しいファイル。