从DB中获取字符串时运行eval

时间:2017-08-29 19:48:01

标签: ruby-on-rails ruby

所以我将这段代码存储在我的数据库中:

def is_ten?(number)
  number == 10 
end

is_ten?(10)

现在我从属于存储它的模型的类方法中引用它。

class Snippet < ApplicationRecord
  def self.run_blocks
    where(active: true).each do |snip|
     eval(snip.code_block)
    end
  end
end

返回:

NoMethodError Exception: undefined method `is_ten?' for #<Class:0x007fd11ba2bec8>

但是,如果我在控制台中这样做,它的效果非常好。有人知道如何处理这个问题吗?

1 个答案:

答案 0 :(得分:0)

而不是eval(snip.code_block,您应该尝试:

snip.instance_eval(code_block)

希望这可以开箱即用,但如果没有,你可能需要尝试define_method

你的代码片段与eval不兼容的原因是1)Ruby不支持嵌套方法,2)你试图从类方法调用实例方法。另一方面,如果你的代码看起来像:

def self.is_ten?(number)
...

你可能会有更好的运气,但你仍然可能会遇到第一个问题。

正如@Mark Thomas所观察到的,这对于生产代码(或者,实际上是任何代码)来说都是一个非常糟糕的主意。即使它不是用于生产用途,也可能是whatever problem you're trying to looking to solve with this question isn't actually the real problem you're looking to solve.