[英]Rails: Including a Concern with a constant within a Concern
我擔心我存儲常量:
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
看起來第一個關注點在第二個關注點中沒有正確加載。 如果是這種情況,我該怎么辦?
看來這種行為是設計使然,正如這里很好地解釋的那樣。
在這種情況下,您需要做的不是讓Group::Constants
從ActiveSupport::Concern
擴展,因為這將阻止其實現與其他ActiveSupport::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
成為標准模塊,然后一切都會好起來的。
如果您想將所有內容保存在一個文件中,並且可以忍受一些樣板文件,則可以將模塊分解為“關注”位和“非關注”位:
module A
FOO = [22]
def self.included base
base.include Concern
end
module Concern
extend ActiveSupport::Concern
class_methods do
def foo_from_the_perspective_of_a_class_method_in_A
{lexical: FOO, instance: self::FOO}
end
end
end
end
module B
extend ActiveSupport::Concern
include A
FOO += [33]
def foo_from_the_perspective_of_an_instance_method_in_B
FOO
end
end
class C
include B
end
C.foo_from_the_perspective_of_a_class_method_in_A
=> {:lexical=>[22], :instance=>[22, 33]}
C.new.foo_from_the_perspective_of_an_instance_method_in_B
=> [22, 33]
C::FOO
=> [22, 33]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.