【问题标题】:Rails code block in controller for repeated code控制器中用于重复代码的 Rails 代码块
【发布时间】:2016-09-12 17:10:18
【问题描述】:

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

【问题讨论】:

  • 你不能用 if 设置你使用的报告吗?然后将 110 行移到 if 之外?只需通过在 if 之外执行 report =nil 来确保报告在范围内。
  • 你的 if 语句没有意义 - 在两个分支中你创建相同的报告
  • 您可以将代码提取到 Proc 中,并使用 instance_eval 方法在两个单独的上下文中执行代码
  • @Doon 原来你的想法是我正在寻找的路径,它完成了工作。谢谢!

标签: ruby-on-rails ruby refactoring


【解决方案1】:

如果您在控制器操作中有 1000 行代码,那么您做错了。 我认为您应该考虑延迟工作/活跃工作或 sidekiq 或 resque

【讨论】:

    【解决方案2】:

    绝对同意控制器中的许多代码行是代码异味,而不仅仅是因为缺乏 DRYness。

    也就是说,您现在可能无法进行完整的重构。两个分支的唯一区别是传递给 new 的字符串和末尾的三行。

      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
    

    【讨论】:

      【解决方案3】:

      你不能只创建一个包含那 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-12
        • 2012-02-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-16
        相关资源
        最近更新 更多