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