这是如何将字符串转换为Rails / Ruby中的类:
p = "Post"
Kernel.const_get(p)
eval(p)
p.constantize
但是如果我从数组/活动记录对象中检索一个方法,例如:
Post.description
但它可能是
Post.anything
其中任何内容都是anything = "description"
之类的字符串。
这很有用,因为我想重构一个非常大的类并减少代码和重复行。我怎样才能使它工作?
答案 0 :(得分:65)
Post.send(anything)
答案 1 :(得分:15)
虽然eval对于这类事物来说可能是一个有用的工具,而那些来自其他背景的人可能会像开罐器那样经常使用它,但实际上很随意使用它。 Eval暗示如果你不小心就会发生任何事情。
更安全的方法是:
on_class = "Post"
on_class.constantize.send("method_name")
on_class.constantize.send("method_name", arg1)
对象#send将调用您想要的任何方法。您可以发送符号或字符串,如果该方法不是私有的或受保护的,应该可以工作。
答案 2 :(得分:15)
由于这是一个Ruby on Rails问题,我将详细说明一下。
在Rails 3中,假设title
是ActiveRecord对象上字段的名称,则以下内容也有效:
@post = Post.new
method = "title"
@post.send(method) # => @post.title
@post.send("#{method}=","New Name") # => @post.title = "New Name"
答案 3 :(得分:0)
试试这个:
class Test
def method_missing(id, *args)
puts "#{id} - get your method name"
puts "#{args} - get values"
end
end
a = Test.new
a.name('123')
因此一般语法为a.<anything>(<any argument>)
。