我有一个问题和两个包括它的类。在关注中,我定义了一个变量。这是关注点和两个模型:
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
),它也会加载常量,加载另一个类尝试再次加载常量,然后给出警告。如何在不必将常量放入两个模型的情况下避免这种情况?感谢
答案 0 :(得分:23)
我在尝试实施问题时遇到了同样的错误。
我也遵循的指南,但包含块中的常量,似乎没有错误。但是我的日志给了我完全相同的错误。
经过一些试验和错误后,我只是从块中移除了Constant并将其放在外面,如:
module UserInstance
extend ActiveSupport::Concern
included do
end
ACTIVE = 'active'
end
这样我仍然可以访问Constant,但没有得到任何错误。我不是100%确定这是正确的方法,但是它有效,我找不到任何错误,所以我会继续使用它。
我想现在,如果这对你也有效!
答案 1 :(得分:1)
使用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