将if-else块重构为更简洁的代码

时间:2013-07-08 22:04:58

标签: ruby-on-rails ruby ruby-on-rails-3.2

我有一堆这样的if-elsif块以else语句结尾,所以我的结构看起来像这样:

if path.end_with?('something')
   template_name = 'something.json.erb'
   res.body =  ERB.new(File.read(File.expand_path("../#{template_name}",  __FILE__))).result(binding)
   res.status = 200
   res['Content-Type'] = 'application/json'
elsif path.end_with?('somethingELSE')
   template_name = 'somethingELSE.json.erb'
   res.body =  ERB.new(File.read(File.expand_path("../#{template_name}",  __FILE__))).result(binding)
   res.status = 200
   res['Content-Type'] = 'application/json'
# a couple more similar if-elsif  blocks in here
else
  res.status = 400
  res['Content-Type'] = 'text/plain'
  res.body = "Invalid path"

因此,在if-elsif块中只有重复的部分中有很多重复的代码。基本上只是设置template_name的行是必要的,我们应该能够将剩下的那三行排除在外,但我最后还有那个阻止我这样做的东西。

您如何建议重构此代码以使其更简洁,重复性更低?

2 个答案:

答案 0 :(得分:2)

['something', 'somethingELSE', 'somethingAGAIN'].each DO  |match|
  substitute = match if path.end.with?(match)
end
if substitute
   template_name = "#{substitute}.json.erb"
   res.body =  ERB.new(File.read(File.expand_path("../#{template_name}",  __FILE__))).result(binding)
   res.status = 200
   res['Content-Type'] = 'application/json'
 else
   res.status = 400
  res['Content-Type'] = 'text/plain'
  res.body = "Invalid path"
end

答案 1 :(得分:1)

以下是一种方法。

if path.end_with?('something') || path.end_with?('somethingELSE')
    if path.end_with?('something')
       template_name = 'something.json.erb'
    elsif path.end_with?('somethingELSE')
       template_name = 'somethingELSE.json.erb'
    # a couple more similar if-elsif  blocks in here
    end

   res.body =  ERB.new(File.read(File.expand_path("../#{template_name}",  __FILE__))).result(binding)
   res.status = 200
   res['Content-Type'] = 'application/json'
else
  res.status = 400
  res['Content-Type'] = 'text/plain'
  res.body = "Invalid path"
end

您还可以解析路径中的somethingsomethingELSE以获取模板名称,从而进一步简化此操作。

假设你有一条正确的道路,a/path/to/something你可以这样做:

template_name = "/assuming/this/is/a/path".split('/').last + '.json.erb'

但是如果没有看到你的其他条件,我就不能说了。