0

Google マップ ジオコーダーで緯度と経度を自動的に取得するアプリがあります。他のフィールド検証と組み合わせるカスタム検証を作成したいと考えています。以下は私のコードです:

# lib/ext/string.rb
class String
  def valid_float?
    # The double negation turns this into an actual boolean true - if you're 
    # okay with "truthy" values (like 0.0), you can remove it.
    !!Float(self) rescue false
  end
end

# config/application.rb
require 'ext/string'

# post.rb
validate :check_point

def check_point
  if !(lat || lng).valid_float?
    ...
  end
end

私のPostフォームでは、firebug を使用してフィールドに入力asdfしましたが、メソッドが見つからないというエラーが返されました。:latvalid_float?

次に、デバッグを試みます。

abort(lat.to_s.valid_float?) # 0.0 true

:latフィールドに入力された数字以外の文字は0.0、私がto_sそれを行うとなるようです。しかし、to_sそれが機能する唯一の方法valid_float?です。to_sすべてのテキストを に変換するのはなぜ0.0ですか?

私もrails cテストしました:

"1.234234".valid_float? # true
"asdf".valid_float? # false
"0.0".valid_float? # true

それを機能させるにはどうすればよいですか?ありがとう。

4

2 に答える 2

0
def check_point
  if !(lat || lng).valid_float?
    ...
  end
end

これはあなたが思うようには機能しません。括弧内の式が最初に評価され、次にvalid_float?結果に対して呼び出されます。rubyの の結果はlat || lng、lat が nil でない場合は lat になり、lat が nil の場合は lng になるため、lat または lng のいずれかを Float に変換できるかどうかを評価しています。

私はこれを次のように書きます

def check_point
  if !lat.valid_float? || !lng.valid_float?
    ...
  end
end

論理的に同等の !(a && b) フォームよりも意図を明らかにしていると思います

于 2012-10-10T03:42:05.657 に答える