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

Ruby on rails 如何将字符串转换为类方法?,ruby-on-rails,ruby,Ruby On Rails,Ruby,以下是如何在Rails/Ruby中将字符串转换为类: p = "Post" Kernel.const_get(p) eval(p) p.constantize 但是,如果我从数组/活动记录对象中检索方法,如: Post.description 但也有可能 Post.anything 其中,anything是一个字符串,类似于anything=“description” 这很有帮助,因为我想重构一个非常大的类,减少代码行和重复。我怎样才能让它工作 虽然eval对于这类事情来说是一个有用的工具

以下是如何在Rails/Ruby中将字符串转换为类:

p = "Post"
Kernel.const_get(p)
eval(p)
p.constantize
但是,如果我从数组/活动记录对象中检索方法,如:

Post.description
但也有可能

Post.anything
其中,anything是一个字符串,类似于
anything=“description”


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

虽然eval对于这类事情来说是一个有用的工具,而且来自其他背景的人可能会像开罐器一样频繁地使用eval,但如此随意地使用实际上是危险的。Eval意味着如果你不小心,任何事情都可能发生

Post.send(anything)
更安全的方法是:

on_class = "Post"
on_class.constantize.send("method_name")
on_class.constantize.send("method_name", arg1)
对象#send将调用您想要的任何方法。您可以发送符号或字符串,但前提是该方法不是私有的或受保护的,应该可以工作。

尝试以下操作:

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.()

,因为这被标记为RubyonRails问题,我将稍微详细说明一下

在Rails 3中,假设
title
是ActiveRecord对象上的字段名,则以下内容也有效:

@post = Post.new
method = "title"

@post.send(method)                # => @post.title
@post.send("#{method}=","New Name") # => @post.title = "New Name"

这已经在执行任意方法。安全性似乎不是主要因素。任意方法与任意代码有很大不同。我怀疑你在课堂上是否有“放下所有桌子”的方法。验证给定字符串是否安全用作方法名也是很基本的,您可以有一个简单的白名单来检查,但是评估任意求值块的危险性是不可能的。您意识到您只需要{const_get,eval,constantize}中的一个,对吗?是的。我当然喜欢。因为我刚刚测试了3.0,工作非常好,谢谢。如果我的方法是:def test=(string){puts string},那么将这么多代码行减少到只有几行。我不认为Post.send(“test”,“hi”)可以很好地工作。使用它更安全(Ruby 1.9或更高版本)