我有一堆这样的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的行是必要的,我们应该能够将剩下的那三行排除在外,但我最后还有那个阻止我这样做的东西。
您如何建议重构此代码以使其更简洁,重复性更低?
答案 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
您还可以解析路径中的something
和somethingELSE
以获取模板名称,从而进一步简化此操作。
假设你有一条正确的道路,a/path/to/something
你可以这样做:
template_name = "/assuming/this/is/a/path".split('/').last + '.json.erb'
但是如果没有看到你的其他条件,我就不能说了。