用多个模块扩展的对象中的方法的Ruby优先级

时间:2011-11-30 15:54:54

标签: ruby module dci

鉴于以下内容:

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的延伸顺序是什么?

1 个答案:

答案 0 :(得分:2)

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(包含模块的实体)。

在您的情况下,您可以检查是否已包含“更高优先级”模块,或查看模块 是否为“更高优先级”模块。基于此,您决定是否添加方法。