1

以下を考えると:

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_contextcurrent_user

4

3 に答える 3

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

あなたの場合、「優先度の高い」モジュールが既に含まれているかどうかを確認するか、そのモジュール「優先度の高い」モジュールであるかどうかを確認できます。それに基づいて、メソッドを追加するかどうかを決定します。

于 2011-11-30T16:38:50.873 に答える
1

管理者もRegisteredUserであるため、私はそうします

module Admin
  include RegisteredUser
  ...
end

そして、ただ

current_user.extend Admin

これが正しい方法かどうかはわかりません。Admin と RegisteredUser がクラスである場合、Admin を RegisteredUser から継承することは理にかなっています。モジュールの場合、わかりません。

于 2011-11-30T16:31:31.160 に答える
1

それはいけません; Ruby では、モジュールのインクルードの順序は、モジュールが検索される順序です (現在のクラスの後、親クラスの前)。「優先度」を変更する唯一の方法は、モジュールを必要な順序で含めるか、モジュールを親クラスに移動することです。

純粋な Ruby ではありませんが、banisterfiend のRemixライブラリを使用して、モジュールの順序を変更 (またはモジュールの unmixin など) できます。

于 2011-11-30T16:35:24.153 に答える