2013-04-11 16 views
17

内で一定と懸念を含め、私は定数を保存する懸念があります、残念ながらのRails:懸念

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 

module Group::Constants 
    extend ActiveSupport::Concern 

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

そして、私はこれらの定数を使用する別の懸念をその結果、ルーティングエラーが発生します。

uninitialized constant User::Groupable::MEMBERSHIP_STATUSES 

最初の問題が正しく読み込まれていないようです第二の関心事。それが事実なら、私はそれについて何ができますか?

+0

このエラーを表示するには、どのコードを呼び出していますか?あるいは 'User :: Groupable'モジュールがロードされたときに発生しますか? – PinnyM

+0

'User :: Groupable'がロードされたときに発生します。 – nullnullnull

答えて

27

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

あなたはこのケースで行う必要がありますどのようであるが、それが最終的に第二のモジュールを含んでいるクラスで共有されますが、(他のActiveSupport::Concern拡張モジュールで共有されることから、その実装をブロックしますので、Group::ConstantsActiveSupport::Concernから延びている必要はありませ):

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

+0

優れた応答と優れたリファレンス。ありがとう! – nullnullnull

+1

'do do'ブロックに定数をラップして' self :: 'という接頭辞を付けることができませんでしたか? –

+0

@EddiePrislacも、それはどちらもしません。 'included'はActiveSupportモジュールに対してハイジャックされ、標準(非ActiveSupport)クラスまたはモジュールにそれらが含まれるまで、実際にコードをトリガーしません。 – PinnyM

関連する問題