方法'is_admin'在哪里?在我的Rails应用程序中定义?

Yar*_*rin 5 ruby ruby-on-rails

我有一些调用的代码

current_user.is_admin?
Run Code Online (Sandbox Code Playgroud)

代码工作正常,但我无法弄清楚is_admin?方法的定义.我正在使用Devise,CanCanrole_model,但该方法不在任何这些项目的源代码中,或者在我的...

我还尝试通过在Rails控制台中执行此操作来查找方法所有者:

current_user.method(:is_admin?).owner
=> #<Module:0x00000105253c98>
Run Code Online (Sandbox Code Playgroud)

但这没什么帮助......

Yar*_*rin 1

我通过执行以下操作获得了源位置:

current_user.method(:is_admin?).source_location
Run Code Online (Sandbox Code Playgroud)

(感谢@BroiSatse)

这让我看到了 role_model 中的这个文件: https://github.com/martinrehfeld/role_model/blob/master/lib/role_model/class_methods.rb

事实证明,role_model 根据分配的角色动态创建方法 - 这就是它没有出现在源代码中的原因......

来自class_methods.rb

# Defines dynamic queries for :role
#   #is_<:role>?
#   #<:role>?
#
# Defines new methods which call #is?(:role)
def define_dynamic_queries(roles)
  dynamic_module = Module.new do
    roles.each do |role|
      ["#{role}?".to_sym, "is_#{role}?".to_sym].each do |method|
        define_method(method) { is? role }
      end
    end
  end
  include dynamic_module
end
Run Code Online (Sandbox Code Playgroud)