鉴于以下情况:
class User; attr_accessor :roles; end
module RegisteredUser
def default_context
Submission
end
end
module Admin
def default_context
Review
end
end
current_user = User.new
current_user.roles = ["registered_user", "admin"]
current_user.roles.each do |role|
role_module = role.gsub(/ /, '_').camelize
if module_exists?(role_module)
current_user.extend role_module.constantize
end
end
context = self.extend current_user.default_context
有没有办法设置User#default_context
的优先级?也就是说,我可以说 Admin#default_context
总是优先于 RegisteredUser#default_context
而不管 current_user
的扩展顺序如何?
最佳答案
method_added
在 Module
中。
我实际上是指included
,而不是extended
,但两者也在Module
中。
该机制将围绕做这样的事情:
module Foo
def self.included(base)
base.extend(FooMethods)
end
module FooMethods
def bar
# Whatever
end
end
end
在 Foo.included
中,您可以根据任意标准确定是否应将相关方法添加到 base
(包含模块的实体)。
在您的情况下,您可以检查是否已包含“更高优先级”模块,或者查看模块是“更高优先级”模块。在此基础上,您将决定是否添加这些方法。
关于使用多个模块扩展的对象中方法的 Ruby 优先级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8328854/