Ruby / Rails中是否有执行string中的代码的方法?

所以我有一个不同代码示例的数据库(阅读片段)。 代码示例是由用户创build的。 有没有办法在Rails执行它?

所以,例如我在我的数据库(ID = 123)有以下代码:

return @var.reverse 

有没有办法让我来执行它? 就像是:

 @var = 'Hello' @result = exec(CodeSample.find(123)) 

所以结果会是'olleH'

你可以使用eval

 code = '@var.reverse' @var = 'Hello' @result = eval(code) # => "olleH" 

但是这样做要非常小心, 您可以让该代码完全访问您的系统。 试试eval('exit()') ,看看会发生什么。

对于eval答案(这是正确的答案),我会补充:拿到一个Pickaxe Book的副本( 编程Ruby或编程Ruby 1.9,取决于你的Ruby版本),并阅读“在安全中lockingRuby”一章 这一章是关于Ruby的安全级别和受污染的对象的,本章将以您的用例为准,以及为什么您需要偏执一点。

如果您的用例非常有限,或者限制用例,也可以使用另一种方法。

我不得不使用这种方法来允许用户dynamic指定相对时间,例如3.months.ago

我用正则expression式来清理用户的input

 PERMITTED_OPERATIONS = /^\{\%([1-9]\.(day|year|month|hour|minute)(s\.|\.)ago|Time\.now)\%\}$/ def permit?(operation) return !PERMITTED_OPERATIONS.match(operation.to_s).nil? end 

您可以扩展正则expression式以允许from_now ,或者为允许的操作创build一个正则expression式数组并循环。

欢迎对这种方法提出任何意见。