Рельсы, вызывающие постоянную заморозку

#ruby-on-rails

Вопрос:

Я попытался выполнить некоторый рефакторинг кода в своем классе webhook manager. Идея состояла в том, чтобы использовать шаблон конструктора (надеюсь, я не ошибся в названиях), в котором один класс распределял задания другим. Вот почему я создаю класс с постоянной переменной WEBHOOK_DEFINITIONS и, в зависимости от предоставленных аргументов, запускаю соответствующие задания ActiveJob. Как показано ниже:

 # frozen_string_literal: true

class ManageWebhookData
  WEBHOOK_DEFINITIONS = {
    default: IdentityChecks::IdentityCheckUpdaterJob,
    #there will be much more
    (...)
  }.freeze.with_indifferent_access

  def initialize(webhook, name)
    @webhook = webhook
    @name = name
  end

  def call
    WEBHOOK_DEFINITIONS[type].perform_later(webhook)
  end

  attr_reader :webhook, :name

  private

  def type
    WEBHOOK_DEFINITIONS.key(name.downcase) ? name.downcase : :default
  end
end
 

Я не знаю почему, но Rails каким-то образом звонит WEBHOOK_DEFINITIONS , даже когда это происходит freeze из-за того, что я получаю ошибку:

 NameError (uninitialized constant IdentityCheckUpdaterJob):
app/services/manage_webhook_data.rb:5:in `<class:ManageWebhookData>'
 

Почему это происходит?

Ответ №1:

Это не рельсы, это рубин.

Константы разрешаются при загрузке класса, вы можете проверить это самостоятельно в консоли

 > class Foo
>   BAR = puts("I'm constant")
> end
I'm constant
 

Кроме того, я не уверен, что, когда индифферентный хэш вызывается для замороженного хэша, он тоже будет заморожен. Я бы написал вместо этого

 WEBHOOK_DEFINITIONS = {
    default: IdentityChecks::IdentityCheckUpdaterJob,
    #there will be much more
    (...)
  }.with_indifferent_access.freeze