红宝石元编程更好的解决方案

时间:2012-12-17 21:15:25

标签: ruby metaprogramming

如果没有eval

,这将如何工作
%w{user_id for_whom_id category_id product_status_id}.each do |f|
  code = <<-C
  it "should fail validation with no #{f}" do
    should_fail_on_validation { |p| p.#{f} = nil }
  end
  C
  eval code
end

1 个答案:

答案 0 :(得分:6)

这应该有效:

%w{user_id for_whom_id category_id product_status_id}.each do |f|
  it "should fail validation with no #{f}" do
    should_fail_on_validation { |p| p.public_send "#{f}=", nil }
  end
end

如果可能的话,最好避免使用eval。在这种情况下,没有必要。