Вызов методов из унаследованного класса в Ruby - PullRequest
0 голосов
/ 02 апреля 2020

У меня есть следующие классы:

Модуль

module AlertService
    module MessageTemplate
      def generate_message
        "test"
      end
    end
  end

Родительский класс:

module Client
  def post uri, params={}
    Net::HTTP.post_form uri, params
  end
end

module AlertService
  class BaseAlert
    extend MessageTemplate
    include Singleton
    include Client
    def initialize; end
  end
end

Дочерний класс:

module AlertService
class TestAlert < BaseAlert
  include Singleton
  def initialize
  options = {
    username: "Screen Alert Bot",
    http_client: Client
  }
  @notifier = Slack::Notifier.new(rails.config.url, options)
  end

  def self.create_message
    message = generate_message
  end

  def self.send_message
    create_message
    @notifier.post blocks: message
  end
end
end

I может создать тестовое оповещение следующим образом: s= AlertService::TestAlert

Но я получаю ошибку, когда делаю это:

s.send_message

NoMethodError: undefined method `generate_message' for AlertService::TestAlert::Class

generate_message - метод из модуль MessageTemplate, включенный в класс BaseAlert. Почему говорится, что мой унаследованный класс не имеет доступа к методу?

1 Ответ

2 голосов
/ 02 апреля 2020

Вы не используете Singleton правильно. Вы включаете его, но затем не используете его, вместо этого полностью обходите его и вызываете методы класса, которые не имеют ничего общего с Singleton. Они, в свою очередь, вызывают методы класса в родительском классе, который не существует.

Решение состоит в том, чтобы использовать Singleton как предполагалось:

module AlertService
  class BaseAlert
    include MessageTemplate
    include Singleton

    def initialize
    end
  end
end

module AlertService
  class TestAlert < BaseAlert
    def initialize
      @notifier = Slack::Notifier.new(Rails.configuration.url, Rails.configuration.options)
    end

    def create_message
      message = generate_message
    end

    def send_message
      create_message
      @notifier.post blocks: message
    end
  end
end

Где вы сейчас вызов с instance как задокументировано :

AlertService::TestAlert.instance.send_message
...