定数を格納することに懸念があります。
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番目の懸念事項で正しく読み込まれていないようです。その場合、私はそれについて何ができますか?
here でうまく説明されているように、この動作は仕様によるもののようです。
この場合に必要なことは、Group::Constants
をActiveSupport::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
を標準モジュールにする必要があります。そうすれば、すべてうまくいくでしょう。