2013-04-11 7 views
17

mam obawy, w którym przechowywać stałe:Szyny: wraz z troski o stały w obrębie koncernu

module Group::Constants 
    extend ActiveSupport::Concern 

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

a inny obawy, że chcesz używać tych stałych:

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 

Niestety, powoduje to błąd routingu:

uninitialized constant User::Groupable::MEMBERSHIP_STATUSES 

Wygląda na to, że pierwszym problemem nie jest prawidłowe ładowanie drugi problem. Jeśli tak, to co mogę z tym zrobić?

+0

Jakiego kodu używasz, aby uzyskać ten błąd? Czy może wystąpić, gdy załadowany zostanie moduł 'User :: Groupable'? – PinnyM

+0

Występuje, gdy załadowany jest 'User :: Groupable'. – nullnullnull

Odpowiedz

27

Wygląda na to, że takie zachowanie jest zgodne z projektem, co zostało szczegółowo wyjaśnione w punkcie here.

Co trzeba zrobić w tym przypadku nie mają Group::Constants rozciągają się od ActiveSupport::Concern ponieważ blokuje jej realizację przed wspólny z innymi modułami ActiveSupport::Concern rozciągających (chociaż to będzie ostatecznie wspólne w klasie, która zawiera drugi moduł):

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' 

krótko mówiąc, trzeba zrobić Group::Constants standardowy moduł i wtedy wszystko będzie dobrze.

+0

Doskonała reakcja i doskonałe odniesienie. Dzięki! – nullnullnull

+1

Nie możesz po prostu owijać stałych w blok "do zrobienia" i poprzedzać je 'self ::'? –

+0

@EddiePrislac nope, to też nie zrobi. Opcja 'included' jest przejęta dla modułów ActiveSupport i nie wywoła kodu w rzeczywistości dopóki nie dołączą do nich standardowa (nie-ActiveSupport) klasa lub moduł. – PinnyM