仅在特定条件下在块中运行代码

时间:2017-05-04 11:38:53

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4

在这里,我想向您展示一个演示代码:

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

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

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:2)

安德烈的答案非常好,应该被接受。

但是只想指出你可以将proc转换为块而不是在块中调用proc ...

 VCR.use_cassette(vcr_cassette, &actions)

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