【发布时间】: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