2017-08-29 47 views
0

採取一個字符串所以我存儲我的數據庫這段代碼時隔離:運行EVAL從DB

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> 

但如果我這樣做的控制檯,它完美的作品。任何人有關於如何處理這個問題的想法?

+2

這在生產代碼中不是件好事。 –

+0

充分認識@MarkThomas!這是學習,而不是生產 –

+0

我得到你想學習,但在同一時間,這就像學習如何刀刺傷你的眼睛。這不是一個非常有用的技能。什麼是更好的是學習如何包這樣的代碼到'在Ruby中module'您可以按需加載,元編程做正確。 – tadman

回答

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.