如何将字符串转换为类方法?

时间:2010-05-26 13:53:33

标签: ruby-on-rails ruby

这是如何将字符串转换为Rails / Ruby中的类:

p = "Post"
Kernel.const_get(p)
eval(p)
p.constantize

但是如果我从数组/活动记录对象中检索一个方法,例如:

Post.description

但它可能是

Post.anything

其中任何内容都是anything = "description"之类的字符串。

这很有用,因为我想重构一个非常大的类并减少代码和重复行。我怎样才能使它工作?

4 个答案:

答案 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>)