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

rei*_*als -1 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
Run Code Online (Sandbox Code Playgroud)

mar*_*ius 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
Run Code Online (Sandbox Code Playgroud)

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