Доступ к константе, определенной в классе, из миксина, включенного в класс - PullRequest
0 голосов
/ 25 сентября 2018

У меня есть миксин (Api::Utility), на который ссылаются два класса: Api::Utility::One::WorkstationClient и Api::Utility::Two::WorkstationClient.Оба класса определяют константу BASE_URL, к которой я хотел бы получить доступ в миксине.Когда я пытаюсь получить доступ к константе, я получаю сообщение об ошибке `NameError (неинициализированная константа Epic :: Api :: Utility :: BASE_URL).

#!/usr/bin/env ruby

module Api

  class WorkstationClientFactory

    def self.create_client(version = :v2)
      case version
      when :v2
        Two::WorkstationClient.new()
      when :v1
        One::WorkstationClient.new()
      else
        raise ArgumentError, "'#{version.inspect}' is not a valid version symbol.  Valid: [:v1|:v2]."
      end
    end

  end # /WorkstationClientFactory

  # Api::Utility
  module Utility
    def bar
      puts "BASE_URL: #{BASE_URL}"
    end
  end

  module One
    # Api::One::WorkstationClient
    class WorkstationClient
      include Api::Utility

      BASE_URL = 'https://domain.tld/api/v1'

      def initialize()
        puts "Creating #{self.class.name}"
      end

    end # /WorkstationClient
  end # One

  module Two
    # Api::Two::WorkstationClient
    class WorkstationClient
      include Api::Utility

      BASE_URL = 'https://domain.tld/api/v2'

      def initialize()
        puts "Creating #{self.class.name}"
      end

    end # /WorkstationClient
  end # /Two

end # /module

v1 = Api::WorkstationClientFactory.create_client(:v1)
v1.bar <-- error here
BASE_URL: https://domain.tld/api/v1  <-- desired result

v2 = Api::WorkstationClientFactory.create_client(:v2)
v2.bar <-- error here
BASE_URL: https://domain.tld/api/v2  <-- desired result

Какой правильный способ доступа к BASE_URLв миксине, в этой ситуации?

1 Ответ

0 голосов
/ 25 сентября 2018

Вы можете использовать self.class::BASE_URL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...