1

我有这个代码...

foo = opt_source.downcase.camelize
"#{foo}".new.start_check

这应该调用一个类和方法 start_check,但我得到一个未定义的方法错误

“Abcd”的未定义方法`start_check':String(Abcd是foo代表的类)

关于我做错了什么的任何建议?

4

3 回答 3

4

您需要将该字符串转换为常量。从历史上看,这是这样做的,eval但这会导致您的代码中出现安全问题——从来没有eval用户提供的字符串。

正确的方法(在 Rails 中)是通过String#constantize

foo = opt_source.downcase.camelize
foo.constantize.new.start_check

对于 ruby​​,使用Kernel#const_get

foo = opt_source.downcase.camelize
Kernel.const_get(foo).new.start_check

在调用你的方法之前不要忘记检查错误。

于 2013-04-08T14:27:04.813 回答
0

只是eval(foo).new.start_check

于 2013-04-08T14:26:41.280 回答
0

从复数表名创建一个类名,就像 Rails 为表名到模型所做的那样。

http://api.rubyonrails.org/classes/ActiveSupport/Inflector.html#method-i-classify

如果您从活动记录中调用方法,camelize 不适合将复数字符串转换为活动记录类

例如:

u = "batteries"
u.camelize #=> "Batteries"
u.classify #=> ""Battery"

尝试

opt_source.classify.constantize.new.send(:start_check)
于 2013-04-08T15:12:11.030 回答