Расширение класса Ruby в Rails работает при локальном объявлении и возвращает `nil` при импорте из`/lib/`

TLDR: расширение хеша работает безупречно, возвращает желаемый результат, когда включено локально в мой почтовик, но всегда возвращает nil при импорте из модуля в lib/даже если метод класса успешно загружен.

Когда я объявляю расширение в моем файле mailer.rb, перед моим определением класса, как в:

class Hash
  def try_deep(*fields)
    ...
  end
end

class MyMailer < ApplicationMailer
  some_hash.try_deep(:some_key)
end

это работает безупречно, но это плохая практика. Я думал, что лучше объявить расширение в /lib/core_ext/hash/try_deep.rb а затем потребуйте это в почтовике, как в:

/lib/core_ext/hash/try_deep.rb:

module CoreExtensions
  module Hash
    module TryDeep
      def try_deep(*fields)
        ...
      end
    end
  end
end

/my_mailer.rb:

require 'core_ext/hash/try_deep'

class MyMailer < ApplicationMailer
  Hash.include CoreExtensions::Hash::TryDeep
  some_hash.try_deep(:some_key)
end

1 ответ

Вы должны ввести свой собственный метод в Hash за пределами вашего класса:

my_mailer.rb:

require 'core_ext/hash/try_deep'

class Hash
  include CoreExtensions::Hash::TryDeep
end

class MyMailer < ApplicationMailer
  some_hash.try_deep(:some_key)
end
Другие вопросы по тегам