Rails代码块在控制器中用于重复代码

时间:2016-09-11 09:30:02

标签: ruby-on-rails ruby refactoring

在我的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行。任何想法都表示赞赏!

3 个答案:

答案 0 :(得分:1)

如果控制器操作上有1000行,那你就错了。 我认为你应该考虑延迟工作/积极工作或sidekiq或resque

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

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