如何将字符串转换为类名,但前提是该类已经存在?

如果Amber是already a类,我可以通过以下方式从字符串到类:

Object.const_get("Amber")

或者(在轨道上)

"Amber".constantize

但是,如果Amber还不是一个类,这两个选项中的任何一个都会以NameError: uninitialized constant Amber分的成绩失败.

我的第一个 idea 是使用defined?方法,但它不区分已经存在的类和不存在的类:

>> defined?("Object".constantize)
=> "method"
>> defined?("AClassNameThatCouldNotPossiblyExist".constantize)
=> "method"

那么,在我try 转换一个类之前,如何测试一个字符串是否命名了它?(好吧,用begin/rescue块来捕捉名称错误怎么样?太难看了?我同意…)

推荐答案

const_defined?美元怎么样?

请记住,在Rails中,开发模式中有自动加载功能,所以在测试时可能会很棘手:

>> Object.const_defined?('Account')
=> false
>> Account
=> Account(id: integer, username: string, google_api_key: string, created_at: datetime, updated_at: datetime, is_active: boolean, randomize_search_results: boolean, contact_url: string, hide_featured_results: boolean, paginate_search_results: boolean)
>> Object.const_defined?('Account')
=> true

Ruby相关问答推荐

使用Mac命令行解密用Ruby加密的Zip

Ruby PKCS7:添加;\r〃;字节正在 destruct 解密

指南针手表:未定义的方法存在吗?对于文件:类

使用正则表达式判断用户输入的开头是否正好有两个大括号

Ruby中带和不带下划线_的方法参数有什么区别

Symfony 2assets资源过滤器异常中的指南针

需要在Ruby中将数组拆分为指定大小的子数组

each_with_index_do 从 1 开始索引

类中的 Ruby 类(或模块中的模块)

使用 Ruby MiniTest 之前/之后的套件

在 Ruby 中创建数字、字符串、数组或哈希的 md5 哈希

为什么 RuboCop 建议用 Array.new 替换 .times.map?

Ruby 的所有/最佳列表?

在Ruby中实现平等的正确方法是什么

Sinatra 登录?

如何转换 Ruby 哈希,使其所有键都是符号?

带有添加和删除参考的 Rails 迁移

if语句末尾带有then有什么区别?

Ruby - Array#<< 和 Array#push 之间的区别

Ruby on Rails switch