我有这段代码......
foo = opt_source.downcase.camelize
"#{foo}".new.start_check
这应该调用一个类和方法start_check,但是我得到一个未定义的方法错误
undefined方法`start_check'代表“Abcd”:String(Abcd是foo代表的类)
关于我做错了什么的任何建议?
答案 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)