2017-05-04 7 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! 

어떻게 이 코드 중복을 방지 할 수 있습니까? 어떻게 할 수 있습니까? 코드를 블록 안에 넣은 다음 직접 또는 블록으로 호출 할 생각이었습니다. 다음은 예입니다.

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

안드레이의 대답은 우수하고 인정해야한다.

그러나 단지는

VCR.use_cassette(vcr_cassette, &actions) 

내가 명시 적으로 호출 더 나은 생각 ... 대신 블록에서 시저를 호출 당신이 블록에 발동을 변환 할 수 있음을 지적하고 싶지만, 단지 지적하고 싶었 대체 기술을 사용하십시오.