web-dev-qa-db-ja.com

Rails:懸念事項内に定数を持つ懸念事項を含める

定数を格納することに懸念があります。

module Group::Constants
  extend ActiveSupport::Concern

  MEMBERSHIP_STATUSES = %w(accepted invited requested
    rejected_by_group rejected_group)
end

そして、私がこれらの定数を使用したいという別の懸念:

module User::Groupable
  extend ActiveSupport::Concern
  include Group::Constants

  MEMBERSHIP_STATUSES.each do |status_name|
    define_method "#{status_name}_groups" do
      groups.where(:user_memberships => {:status => status_name})
    end
  end
end

残念ながら、これによりルーティングエラーが発生します。

uninitialized constant User::Groupable::MEMBERSHIP_STATUSES

最初の懸念事項が2番目の懸念事項で正しく読み込まれていないようです。その場合、私はそれについて何ができますか?

24
nullnullnull

here でうまく説明されているように、この動作は仕様によるもののようです。

この場合に必要なことは、Group::ConstantsActiveSupport::Concernから拡張することではありません。これにより、実装が他のActiveSupport::Concern拡張モジュールと共有されなくなります(最終的には共有されますが) 2番目のモジュールを含むクラス内):

module A
  TEST_A = 'foo'
end

module B
  extend ActiveSupport::Concern
  TEST_B = 'bar'
end

module C
  extend ActiveSupport::Concern
  include A
  include B
end

C::TEST_A 
=> 'foo'
C::TEST_B 
=> uninitialized constant C::TEST_B

class D
  include C
end

D::TEST_A 
=> 'foo'
D::TEST_B 
=> 'bar'

つまり、Group::Constantsを標準モジュールにする必要があります。そうすれば、すべてうまくいくでしょう。

34
PinnyM