未定义的方法错误:string

时间:2013-04-08 14:17:40

标签: ruby

我有这段代码......

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

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

  

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

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

3 个答案:

答案 0 :(得分: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

在打电话给你的方法之前,不要忘记检查错误。

答案 1 :(得分:0)

只需eval(foo).new.start_check

答案 2 :(得分: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)