2012-12-17 67 views
-1

這將如何沒有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 

工作?

+0

「更好/最好」的解決方案問題應該發佈在http://codereview.stackexchange.com/ –

+0

我明白了爲什麼這是封閉的,但我認爲只需稍加修改即可重新打開。也許如果它是問如何做到這一點,而不使用eval? –

回答

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。在這種情況下,這是沒有必要的。

+0

鑑於'send'及其伴侶方法的靈活性,您幾乎不需要* eval'。 – tadman