我将两个以不同方式实现的示例类放在一起,这很好地反映了我想在Rails模型中做的事情。我担心的是,我不知道使用任何一种方法的问题是什么。我只发现了解释如何实现它们的帖子或者在使用它们时要避免/小心的一般警告。我没有找到的是一个明确的解释,说明如何安全地完成这个,以及我要小心什么或为什么我应该避免这种模式。
class X
attr_accessor :yn_sc, :um_sc
def initialize
@yn_sc = 0
@um_sc = 0
end
types = %w(yn um)
types.each do |t|
define_method("#{t}_add") do |val|
val = ActiveRecord::Base.send(:sanitize_sql_array, ["%s", val])
eval("@#{t}_sc += #{val}")
end
end
end
class X
attr_accessor :yn_sc, :um_sc
def initialize
@yn_sc = 0
@um_sc = 0
end
types = %w(yn um)
types.each do |t|
# eval <<-EVAL also works
self.class_eval <<-EVAL
def #{t}_add(val)
@#{t}_sc += val
end
EVAL
end
end
x = X.new
x.yn_add(1) #=> x.yn_sc == 1 for both
答案 0 :(得分:1)
好吧,您的代码看起来非常安全。但想象一下基于用户输入的代码。它可能看起来像
puts 'Give me an order, sir!'
order = gets.chomp
eval(order)
如果我们的队长疯狂并命令我们'rm -rf ~/'
,会发生什么?可悲的事情肯定!
所以请上一点课。 eval
不安全,因为它会评估它收到的每个字符串。
但使用eval
的另一个原因是 。有时它的评估速度比替代方案慢。如果感兴趣,请查看here。