2016-09-11 2 views
0

레일즈 애플리케이션에서 odf-report gem을 사용하여 리포트를 생성합니다. 그러나 나는 if condition 내 끝 부분에 하나 또는 두 개의 변경 사항과 각 절에서 동일한 110 줄의 코드를 사용합니다. 코드 블록에서 반복되는 110 개의 라인을 정의하고 내 메인 메소드에서 해당 코드 블록을 호출하는 방법이 있는지 궁금합니다. 아래 방법의 예입니다반복 코드 용 컨트롤러에서 코드 블록을 레일링하십시오.

def print_enrolment_form_completed 
    kid = Kid.find(params[:id]) 
    if kid.not_anaphylactic? 
    report = ODFReport::Report.new("#{Rails.root}/app/reports/Student_Enrolment_Completed.odt") do |r| 
     #same 110 lines of code 
    end 
    else 
    report = ODFReport::Report.new("#{Rails.root}/app/reports/Student_Enrolment_Completed_Allergy.odt") do |r| 
     #same 110 lines of code 
     r.add_field(:a2, kid.fish ? "Yes" : "No") 
     r.add_field(:a3, kid.eggs ? "Yes" : "No") 
     r.add_field(:a4, kid.milk ? "Yes" : "No") 
    end 
    end 
end 

내 목표는 단지 ​​컨트롤러의 다른 곳에서 정의 된 110 줄을 주석 위에 나열된 코드 블록을 산출 할 것입니다. 모든 아이디어를 높이 평가합니다!

+1

if와 함께 사용중인 보고서를 설정할 수 없습니까? 그리고 나서 110 선을 if의 바깥으로 옮깁니 까? if의 외부에 report = nil을 수행하여 보고서가 범위 내에 있는지 확인하십시오. – Doon

+2

if 문은 이해하지 못함 - 두 가지 분기에서 동일한 보고서를 만들 수 있음 –

+0

Proc에 코드를 추출하고 'instance_eval' 메서드를 사용하여 두 개의 별도 컨텍스트에서 코드를 실행할 수 있습니다. – illusionist

답변

0

컨트롤러의 많은 코드 줄은 건조한 느낌이 아니라 코드 냄새입니다.

즉, 전체 리팩토링을 지금 할 수있는 곳이 아닐 수도 있습니다. 두 가지 분기점의 유일한 차이점은 끝에있는 새 줄과 세 줄로 전달되는 문자열입니다.

report = ODFReport::Report.new(kid.not_anaphylactic? ? "#{Rails.root}/app/reports/Student_Enrolment_Completed.odt" : "#{Rails.root}/app/reports/Student_Enrolment_Completed_Allergy.odt") do |r| 
    #same 110 lines of code 
    If kid.not_anaphylactic? 
     r.add_field(:a2, kid.fish ? "Yes" : "No") 
     r.add_field(:a3, kid.eggs ? "Yes" : "No") 
     r.add_field(:a4, kid.milk ? "Yes" : "No") 
    end 
end 
0

110 줄의 코드를 포함하는 메소드를 작성하고 if 문에서 사용할 수 있습니까?

def method_name(z, y) 
     puts z + y 
    end 

    x = 4 

    if x > 3 
     method_name(6, 7) 
    else 
     method_name(1, 4) 
    end 
1

컨트롤러 동작에 1000 줄의 라인이있는 경우 잘못하고 있습니다. 지연된 작업/활성 작업 또는 sidekiq 또는 resque를 고려해야한다고 생각합니다.