Правильное использование констант беспокойства

У меня есть одна проблема и два класса, которые включают ее. В беспокойстве я определил одну переменную. Вот проблема и две модели:

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