1

我有一堆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 的那一行是必要的,我们应该能够将接下来的三行中的其余部分分解出来,但是最后我有其他的东西阻止我这样做。

您如何建议重构此代码以使其更简洁且重复代码更少?

4

2 回答 2

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
于 2013-07-08T22:32:44.917 回答
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'

但我不能说没有看到你的其他条件。

于 2013-07-08T22:35:37.347 回答