2016-09-11 4 views
0

私のレールアプリケーションでは、odf-report gemを使ってレポートを生成しています。しかし私はif condition私の方法では、最後に1つまたは2つの変更を各句で同じ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'メソッドを使用して2つの別々のコンテキストでコードを実行することができます – illusionist

答えて

0

コントローラー内の多くのコード行は、DRYnessの不足だけでなく、コードの匂いです。

つまり、完全なリファクタリングが可能な場所にいない可能性があります。 2つのブランチの唯一の違いは、新しい行と最後の3行に渡される文字列です。

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

コントローラの動作に1000sの行がある場合は間違っています。 遅延ジョブ/アクティブジョブやサイドキックまたはリークを考慮する必要があると考えます。

関連する問題