1

HTTP リクエストからの応答コードを分析し、その応答コードに基づいて、その情報をどのように記録しているかを判断しています。問題は、データが常に true として記録されることです。たとえば、応答コード 500 を受け取った場合、失敗を記録したいと考えています。200点を取ったら成功したい。しかし、私は常に成功しています。誰かが私のコードを見て、私が間違っていること、またはそれを修正するために何ができるか教えてもらえますか?

これが私に問題を与えるコードです:

if response.code == "200" or "201" or "202" or "203" or "204"

文字列を渡していると思っていたので、Ruby が条件を評価すると true を返すのですが、: を追加しようとし.to_i(base=10)ましたが、成功しませんでした。

どんな助けでも大歓迎です。

4

5 に答える 5

8

すでに述べたように、その if ステートメントは次のとおりです。if response.code == "200" or "201" or "202" or "203" or "204"

エレガントな修正は次のようになります。

if ('200'..'204').include? response.code
于 2012-12-12T01:50:11.700 に答える
5

問題は、の使用にありorます。との違いの詳細な説明についてはhttp://www.coshx.com/blog/2012/10/31/rubys-and-and-or-operators-explainedを参照してください。ただし、ここでの問題はさらに基本的なものです。書いたかのようにor||

if response.code == "200" or true

これは常に に評価されtrueます。これをに変更する必要があります

if response.code == "200" or response.code == "201" or ...
于 2012-12-12T01:47:09.827 に答える
4

response.code == "200" or "201" or "202" or "203" or "204" 応答コードが「200」の場合、エラーはこの式 であり、true を返します

応答コードが「201」の場合、「201」を返します

応答コードが「500」の場合、「201」も返します

20 で始まる応答コードに一致させたい場合は、regex または start_with? を使用できます。メソッド。

たとえばresponse.code =~ /^20\d$/、または response.code.start_with?('20')

于 2012-12-12T01:47:06.133 に答える
3

複数の可能な値に対してテストする場合、いくつかのアプローチがあり、それぞれに長所と短所があります。

範囲またはリストに対するテストinclude?は、リストが小さく、必ずしも事前にわかっていない場合に適しています。より優れたバージョンでは、配列の代わりにハッシュを使用します。これは、通常、ハッシュのルックアップ時間が、10 個を超えるエントリで大幅に高速になるためです。配列は最初から一致するまでスキャンされることを思い出してください。これは、最悪の場合、すべての要素の等価性をテストすることを意味します。

より固定されたロジックのより良いアプローチは次のcaseとおりです。

 case (response.code)
 when '200', '201', '202', '203', '204'
   # ...
 else
   # ...
 end

これらは最適化されており、驚くほど迅速に実行されます。また、さまざまなマッチング タイプを処理できる柔軟性もあります。あなたの場合、すでにロジックを綴っているので、これはおそらく最も近い機能です。

は ではないため、常に true と評価される とx == 'a' or 'b'同等であることを思い出してください。(x == 'a') or 'b''b'nilfalse

于 2012-12-12T05:09:28.787 に答える
1

他の人が言ったように、あなたの条件は「201」を返します。これは「真」の値であるためです。真でない値は nil と false のみです。

それを行う方法は

if ['200','201','202','203','204'].include? response.code
于 2012-12-12T01:53:36.333 に答える