Переменная класса Ruby для инициаторов init () - PullRequest
0 голосов
/ 01 февраля 2019

Как я могу заполнить переменные экземпляра из хеша конфигурации, который я хочу оставить внутри определения моего класса?У меня есть разработка и production набор значений, которые я хочу добавить в переменные экземпляра на initialize().Как мне это сделать?

Вот что у меня есть:

class Alpha

    CONFIG = {  development: {mid: '123', uid: 'trial', pin: 'abcde' },
        production: {mid: '65432', uid: 'go_go_go', pin: 'kwir7' }
        }

    def initialize(environment = 'development')
        @env = environment
        @mid = nil
        @uid = nil
        @pin = nil
    end

end

a = Alpha.new('development)
puts a.inspect      
# ==> #<Alpha:0x00007fb1228d6b68 @env="development", @mid=nil, @uid=nil, @pin=nil>

Я хотел бы использовать константу Config для заполнения трех пустых переменных экземпляра.В идеале я хотел бы установить их внутри initalize(), однако можно выполнить вызов private method для установки этих значений.Задача осталась прежней, используя class variable или constant, чтобы взять ее, и я не могу этого достичь.Я предполагаю, что парковка такой учетной записи key-value pairs внутри class definition, является лучшей практикой для такого приложения.То есть: показатели учетной записи электронной коммерции.

Я пробовал следующее, но, похоже, не удалось получить правильные ссылки на хеш-значения Config.

@mid = Alpha::Config[environment.to_s][:mid]

Чтобы никто не отказывался от этого поста, на этот вопрос ответили not :

Ruby: определение хеша уровня класса по умолчаниюзначения

Путаница с переменной класса ruby ​​

1 Ответ

0 голосов
/ 01 февраля 2019

Помните, что в Ruby символы и строки не эквивалентны, поэтому вы должны явно конвертировать при поиске в хэше с символьными клавишами:

class Alpha
  CONFIG = {
    development: { mid: '123', uid: 'trial', pin: 'abcde' },
    production: { mid: '65432', uid: 'go_go_go', pin: 'kwir7' }
  }

  attr_reader :mid, :uid, :pid

  def initialize(environment = 'development')
    @env = environment.to_sym

    @mid = CONFIG.dig(@env, :mid)
    @uid = CONFIG.dig(@env, :uid)
    @pid = CONFIG.dig(@env, :pid)
  end
end

Теперь это работает:

Alpha.new('development').mid
# => "123"

Вызов .to_sym при назначении @env заботится о преобразовании, затем его можно использовать после этой точки.dig используется, чтобы избежать сбоя, если определенная среда не определена, вместо этого просто появляются значения nil.

...