Ruby 检查NamedSpace类是否存在

Ruby 检查NamedSpace类是否存在,ruby,constants,Ruby,Constants,我正在编写一个助手来检查给定的类是否存在 def safe_constant(constant_sym) return Object.const_get(constant_sym) if Object.const_defined? constant_sym end 这对于safe\u常量(:User) 但是,我们有许多在模块中使用名称空间的对象 safe_常量(:Admin::User)显然不是有效的符号。我知道我可以通过以下方式确定是否存在这种情况: Object.const\u get

我正在编写一个助手来检查给定的类是否存在

def safe_constant(constant_sym)
  return Object.const_get(constant_sym) if Object.const_defined? constant_sym
end
这对于
safe\u常量(:User)

但是,我们有许多在模块中使用名称空间的对象

safe_常量(:Admin::User)
显然不是有效的符号。我知道我可以通过以下方式确定是否存在这种情况:


Object.const\u get(:Admin).const\u get(:User)
但是在我开始编写某种拆分循环向下钻取方法来获取最终常量之前,是否已经有了处理这个问题的标准方法?

类似的方法怎么样

def safe_constant(constant_sym)
  return constant_sym.to_s.constantize if valid_constant? constant_sym.to_s
end


def valid_constant?(const)
  const.constantize
  return true
rescue NameError
  return false
end

根据RubyAPI文档,可以获取并使用名称空间字符串检查并返回类常量。需要做的是将第二个参数(
inherit
)传递为
false
,例如:

类用户;结束
模块管理员
类用户;结束
结束
Object.const_已定义?('Admin::User',false)#=>true
Object.const_get('Admin::User',false)#=>Admin::User
PS:并且不接受命名空间符号,并将引发NameError异常,例如:

#名称空间字符串
Object.const_已定义?('Admin::User',false)#=>true
#名称空间符号
Object.const_已定义?(:'Admin::User',false)
#=>名称错误(错误的常量名称Admin::User)

接受类名作为符号是否很难?因为将其作为字符串进行测试要容易得多:
Object.const_get('Admin::User')rescue nil
。我最初尝试过这样做,但出现了错误:
错误的常量名称Admin::User
请注意,
constantize
方法来自activesupport gem。