#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