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

标签 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 的扩展顺序如何?

最佳答案

method_addedModule 中。

我实际上是指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/

相关文章:

ruby-on-rails - Mongodb:在 Web URL 上创建唯一索引是个好主意吗?

ruby 彩虹/ unicorn 开始 faye and rails

ruby - 如何将文件作为 Ruby 模块的一部分?

javascript - javascript 中的数据上下文交互 (DCI) 和事件编程

ruby-on-rails - 什么是 DCI,它如何适应 Rails?

ruby-on-rails - Rails 的 "validates"是什么类型的语言结构?

ruby - AASM:将状态机定义与类定义分开

ruby - 如何知道调用了哪个模块用户

mysql - 尝试部署 Rails 应用程序时,使用 MySql 时出现重复列名错误