检查常量是否定义的正确方法是什么?

dev*_*054 3 ruby ruby-on-rails ruby-on-rails-5 ruby-on-rails-5.1

我有一个字符串,我只想检查它是否是"模型"......所以在搜索后我找到了一种方法:

'any_name'.classify.constantize
Run Code Online (Sandbox Code Playgroud)

但是......当它不是有效的模型名称时,会抛出以下错误:

NameError(错误的常量名称AnyName):

所以我尝试做以下事情:

if Object.const_defined?('AnyName')
  #...
end

# I also tried this:
Object.const_get('AnyName')
Run Code Online (Sandbox Code Playgroud)

但同样,上述两个选项都返回相同的错误:

NameError(错误的常量名称AnyName):

const_defined不该只返回真/假,而不是抛出一个错误?

目前,我发现了这个丑陋的解决方法:

'any_name'.classify.constantize rescue nil
Run Code Online (Sandbox Code Playgroud)

但AFAIK并不是一个好习惯(也是rubocop声称这个).

所以,我的问题是......有一种安全的方法吗?

wid*_*ayd 6

有方法safe_constantize 可以帮助你,如果没有定义,它将返回nil

"ModelName".classify.safe_constantize
Run Code Online (Sandbox Code Playgroud)

这是safe_constantize的链接