2017-05-04 40 views
0

在这里,我想向你展示一个演示代码:块运行的代码只有在一定的条件

if ENV["PRODUCTION"] 
    user.apply_discount! 
    product.update! 
else 
VCR.use_cassette(vcr_cassette) do 
    user.apply_discount! 
    product.update! 
end 
end 

所以基本上两次我也有同样的代码:

user.apply_discount! 
    product.update! 

如何我可以防止这种代码重复吗?你会怎么做? 我正在考虑将代码放在一个Block中,然后直接或者在块中调用它。这里有一个例子:

actions = Proc.new do 
    user.apply_discount! 
    product.update! 
end 

if ENV["PRODUCTION"] 
    actions.call 
else 
VCR.use_cassette(vcr_cassette) do 
    actions.call 
end 
end 

你有其他的想法?解决方案更好谢谢

回答

3

您的版本是明确和可读的。

我唯一要做的是将它移动到一个通用的方法:

def do_env_specific_stuff(stuff) 
    ENV('PRODUCTION') ? stuff.call : VCR.use_cassette(vcr_cassette) { stuff.call } 
end 

然后:

stuff = proc do 
    user.apply_discount! 
    product.update! 
end 

do_env_specific_stuff(stuff) 
+0

这很酷。但是'ENV('PRODUCTION')'在方法中可以访问,所以我们需要将它作为参数传递? – SteveTurczyn

+0

@SteveTurczyn良好的通话。无需通过无处不在的可变变量:) –

2

安德烈的回答是优秀的,应该被接受。

但只是想指出的是您可以将PROC转换成块的,而不是调用块中的处理...

VCR.use_cassette(vcr_cassette, &actions) 

我认为显式调用比较好,但只是想点出一种替代技术。