27

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

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 番目の懸念事項に適切に読み込まれていないようです。その場合、どうすればよいですか?

4

2 に答える 2

40

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標準モジュールを作成する必要があり、それですべてがうまくいきます。

于 2013-04-11T17:10:04.570 に答える