我有这个代码...
foo = opt_source.downcase.camelize
"#{foo}".new.start_check
这应该调用一个类和方法 start_check,但我得到一个未定义的方法错误
“Abcd”的未定义方法`start_check':String(Abcd是foo代表的类)
关于我做错了什么的任何建议?
我有这个代码...
foo = opt_source.downcase.camelize
"#{foo}".new.start_check
这应该调用一个类和方法 start_check,但我得到一个未定义的方法错误
“Abcd”的未定义方法`start_check':String(Abcd是foo代表的类)
关于我做错了什么的任何建议?
您需要将该字符串转换为常量。从历史上看,这是这样做的,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
在调用你的方法之前不要忘记检查错误。
只是eval(foo).new.start_check
从复数表名创建一个类名,就像 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)