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 を設定する行だけが必要で、残りの次の 3 行を除外できるはずですが、最後に他の行があるため、それができません。

このコードをリファクタリングして、より簡潔で繰り返しの少ないコードにすることをどのように提案しますか?

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

以下は、その方法の 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 に答える