Первое, что нужно иметь в виду, - это то, что создание патчей для класса напрямую, то есть открытие класса для определения нового метода, не рекомендуется. Это работает, но не очень гибко и считается запахом кода.
Более разумный подход к патчированию обезьян - это определить ваши методы в миксине и затем включить его в класс.
Это также позволяет условно включать миксин. Например, общее требование в Ruby Gems состоит в том, чтобы реализовывать или определять что-то, только если другая библиотека уже загружена. Обычный способ сделать это - проверить, определена ли константа из этой библиотеки. Например, в вашем случае вы можете сделать это:
module PresenceExtensions
def blank?
respond_to?(:empty?) ? (respond_to?(:strip) ? strip.empty? : !!empty?) : !self
end
end
unless Module.const_defined?("Rails") || Object.method_defined?(:blank?)
Object.include PresenceExtensions
end
Другая распространенная техника - попытаться загрузить драгоценный камень, а затем добавить альтернативный патч обезьяны, только если драгоценный камень недоступен:
begin
require "active_support/core_ext/object/blank"
rescue LoadError
Object.include PresenceExtensions
end
Преимущество этого метода заключается в том, что он немедленно сообщит вам, если камень недоступен, так что вам не придется беспокоиться о порядке загрузки.