在ruby中组织模块,服务及其共享方法

时间:2018-10-31 14:23:17

标签: ruby-on-rails ruby

我正在尝试在两个ruby服务之间共享一种方法,这些服务有很多共同点,并且它们都在同一模块内。

TranslatorManager是启用服务的模块:CacheEraserTranslator

共享方法为key_cache,我需要从CacheEraserTranslator服务中调用它,仅对它们而言,它仅与TranslatorManager有关,因此我假设这段代码必须在模块文件translator_anager.rb

每个服务都有其文件,所有这些文件都在文件夹app/services/site/translator_manager/

enter image description here

对我来说,这是正确的文件组织,对吗?

如何从key_cache服务方法调用call?这不起作用

  • 我无法从嵌套类中包含Site :: TranslatorManager
  • 需要key_cache是一个类方法吗?如何考虑到不同的文件来扩展它?我已经尝试过此answer,但无法正常工作。

cache_eraser.rb

module Site
  module TranslatorManager
    class CacheEraser < ApplicationService
      def initialize(company_id, text, head_locale, locale)
        @company_id, @text, @head_locale, @locale = company_id, text, head_locale, locale
      end

      def call
        #             ---> Don't work <----
        Rails.cache.delete key_cache(@company_id, @text, @head_locale, @locale)
      end
    end
  end
end

translator_manager.rb

module Site
  module TranslatorManager
    def key_cache(company_id, text, head_locale, locale)
      # return a string
    end

    def translatable_key?(key)
      # return true or false
    end
  end
end

1 个答案:

答案 0 :(得分:1)

您需要在Site::TranslatorManager类中包含CacheEraser模块:

module Site
  module TranslatorManager
    class CacheEraser < ApplicationService
      include Site::TranslatorManager # include module methods
      def initialize(company_id, text, head_locale, locale)
        @company_id, @text, @head_locale, @locale = company_id, text, head_locale, locale
      end

      def call
        #             ---> will work <----
        Rails.cache.delete key_cache(@company_id, @text, @head_locale, @locale)
      end
    end
  end
end