Правильное использование констант беспокойства
У меня есть одна проблема и два класса, которые включают ее. В беспокойстве я определил одну переменную. Вот проблема и две модели:
module UserInstance
extend ActiveSupport::Concern
included do
ACTIVE = 'active'
end
end
class Guardian < ActiveRecord::Base
include UserInstance
end
class Student < ActiveRecord::Base
include UserInstance
end
Я получаю следующие предупреждения:
/app/app/models/concerns/user_instance.rb:12: warning: already initialized constant UserInstance::ACTIVE
/app/app/models/concerns/user_instance.rb:12: warning: previous definition of ACTIVE was here
Я предполагаю, что как только он загружает один класс (например, Guardian
), он также загружает константу, а загрузка другого класса пытается снова загрузить константу, а затем указывается предупреждение. Как я могу избежать этого, не ставя константы в две модели? Благодаря
Ответы
Ответ 1
Я просто наткнулся на ту же ошибку, когда пытался реализовать проблемы.
В руководстве я также следил, но Константа в включенном блоке и, казалось, не имела ошибки. Но мой журнал бросил на меня ту же ошибку, что и у вас.
После некоторых проб и ошибок я просто удалил константу из блока и вытащил ее наружу, например:
module UserInstance
extend ActiveSupport::Concern
included do
end
ACTIVE = 'active'
end
Таким образом, я все еще мог получить доступ к константе, но больше не получал ошибок. Я не уверен на 100%, что это правильный путь, но он работал, и я не мог найти никаких ошибок, поэтому я поеду с ним.
Я бы хотел, если бы это сработало для вас тоже!
Ответ 2
Использование base
решило проблему для меня.
module UserInstance
extend ActiveSupport::Concern
# https://api.rubyonrails.org/v6.0.0/classes/ActiveSupport/Concern.html#method-i-included
included do |base|
base.const_set :ACTIVE, "active"
# direct const creation in this included block will attach the const to the concern module, not the including class
# so if you have multiple classes including the same concern, it will try to difine the same const to the same module
# ACTIVE = "active"
end
end