簡體   English   中英

控制器中的Rails代碼塊,用於重復代碼

[英]Rails code block in controller for repeated code

在我的Rails應用程序中,我使用odf-report gem生成報告。 但是,我的方法中有一個if condition ,每個子句中有相同的110行代碼,最后有一個或兩個更改。 我想知道是否有辦法定義在代碼塊中重復的110行,然后在我的main方法中調用該代碼塊? 下面是該方法的示例:

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行。 任何想法表示贊賞!

如果您在控制器操作上有1000條線路,那您做錯了。 我認為您應該考慮延遲的工作/現役或sidekiq或resque

您是否只能創建一個包含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

可以肯定的是,控制器中的許多代碼行都有代碼味道,而不僅僅是缺乏DRYness。

也就是說,您可能不在現在可以進行完整重構的地方。 兩個分支之間唯一的區別是傳遞給新行的字符串和末尾的三行。

  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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM