正确使用关注的常数

时间:2014-09-18 22:05:32

标签: ruby-on-rails-4

我有一个问题和两个包括它的类。在关注中,我定义了一个变量。这是关注点和两个模型:

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),它也会加载常量,加载另一个类尝试再次加载常量,然后给出警告。如何在不必将常量放入两个模型的情况下避免这种情况?感谢

2 个答案:

答案 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