Куда помещать код при исправлении обезьян

Все, что я читал об исправлении обезьян, говорит о том, чтобы сделать что-то вроде этого:

class String
  def foo
    #your special code 
  end
end

Но я не могу найти никаких инструкций о том, где разместить этот код. В приложении rails я могу просто поместить это какое-нибудь безумное место, которое захочу? В модуле? Модель?

Нужно ли что-то включать в файл, где я определяю свой monkeypatch? Нужно ли включать мой monkeypatch везде, где я хочу его использовать?

2 ответа

Решение

На это нет установленных правил. Технически вы можете открыть его (класс; и добавить свой метод) в любом месте. Я обычно делаю специальный файл под названием monkey_patches.rb и положить его в config/initializers или в misc папка в моем приложении Rails, так что если есть конфликт, я знаю, где искать.

Также я бы посоветовал использовать Module обернуть участок обезьяны. Проверьте 3 способа обезьяны патч, не делая беспорядок для получения дополнительной информации.

Его пример:

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

DateTime.include CoreExtensions::DateTime::BusinessDays

Я использовал следующую технику, описанную Джастином Вейссом в 3-х путях, чтобы обезьяна-патч без суеты

Например, в ванильном Ruby, геме, вы определяете модуль в каком-то файле, который вам требуется, а затем include (или же extend ) модуль в нужный класс.

module StringMonkeypatch
  def foo
    #your special code 
  end
end

String.include StringMonkeypatch

Когда в Rails вы можете определить модуль в месте, которое загружается автоматически (посмотрите вверх autoload_paths) и в соответствии с соглашением об именах Rails.

Например, если обезьяна Sidekiq::Testing gem class вы должны отражать структуру файла.

# 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

Просто вмешиваюсь, потому что мне понадобилось целую вечность, чтобы понять это, потому что очень мало решений работало.

• Мне пришлось использовать старый добрый запрос. Я положил это в 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! в файле, который я пытаюсь потребовать, чтобы я мог проверить консоль, чтобы увидеть, действительно ли она загружается.

• Кроме того, если вы используете пружинный загрузчик, прежде чем запускать консоль, вы должны сделать bin/spring stop в вашем терминале, прежде чем запустить консоль. В противном случае он не будет загружать новые файлы.

Другие вопросы по тегам