将字符串转换为类名而不会引发错误

时间:2018-12-13 13:29:27

标签: ruby-on-rails ruby

我正在尝试使用常量化将字符串转换为类名。但是,如果不存在类名或字符串为空或nil,则会引发错误。

有什么方法可以将字符串转换为类名而不会引发错误。或仅在无法转换时才返回false。

5 个答案:

答案 0 :(得分:4)

我讨厌Rails,它带来了大量的冗余辅助程序,通常零值。使用纯Ruby可以很容易地做到这一点:

Kernel.const_get(string) if Kernel.const_defined?(string)

如果未定义该类,则以上内容将有效地返回该类或nil(在Ruby中为false)。

答案 1 :(得分:3)

首先,我想从上面的答案中指出一些东西。 rescue false表示从该表达式引发的各种异常都被抢救为false。这意味着即使您拥有类NoMethodErrorRuntimeError的异常对象,您也将返回false,并且您的期望是常量字符串与应用程序中的常量不匹配。如果您不知道ruby中的错误处理系统如何工作,这可能会导致您花费大量的调试时间。将来也是在您的代码中引入很多错误的地方。

我看到了 ruby​​-on-rails 标签,因此我认为您在Rails应用程序中遇到问题。您可以使用ActiveSupport::Inflector模块中的帮助方法。您可能不希望使用constantize来营救safe_constantize方法。如果项目中不存在常量,它将返回nil

用法示例(请注意,我没有在项目中定义Foo常量):

# with constantize
irb(main) > 'foo'.constantize
=> NameError (wrong constant name foo)

# with safe_contantize 
irb(main) > 'foo'.safe_constantize
=> nil

答案 2 :(得分:0)

怎么了?如果是例外情况,您可以执行以下操作:

the_class = your_string.constantize rescue false

在这种情况下,rescue捕获异常并返回false

答案 3 :(得分:0)

您可以提供默认值,或者在with cte as ( select c.cat_id as parent_id, c.cat_id from categories c union all select cte.parent_id, c.cat_id from cte join categories c on cte.parentid = c.subcategory_from ) select p.* from products p where p.category in (select cte.cat_id from cte where cte.parent_id = 1 ); 的情况下提早返回,然后抢救nil

NameError

编辑:它比简单的长

def to_class(name)
   # default to empty string
   (name || "").constantize
rescue NameError
   false 
end 

def to_class(name)
   # guard against invalid input
   return false if name.nil?

   name.constantize
rescue NameError
   false 
end 

但是IMO,您应该挽救最具体的错误。 string.constantize rescue false 对于简单的脚本或一些测试用例是可以的。在生产代码中,这很有风险-您可以隐藏一些应该冗长的异常。

答案 4 :(得分:0)

您可以通过以下方式来实现,

string.constantize rescue false

其他

如果您有小写的字符串或表名,也可以使用classify方法将其转换为类名,如下所示,

string.classify.constantize rescue false

如果您有字符串'event_managers',它将返回类EventManager