0

我有一个使用谷歌地图地理编码器自动获取纬度和经度的应用程序。我想为它编写一个自定义验证以与其他字段验证相结合。下面是我的代码:

# 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字段:lat,它返回了valid_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 不为 nil,则 lat 的结果lat || lng将是 lat,如果 lat 为 nil,则为 lng,因此您正在评估 lat 或 lng 中的一个是否可以转换为浮点数。

我会把它写成

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

我认为它比逻辑上等价的 !(a && b) 形式更能揭示意图

于 2012-10-10T03:42:05.657 回答
0

如果 Post.lat 和 Post.long 字段具有浮点类型,当您从表单输入中分配字符串值时,Rails 会将它们转换为 Float。
这些是您可以进行的一些更改:
- 在分配值之前验证控制器中的表单输入;
- 将数据类型更改为 String 并提供获取 Float 值的方法;
- 更改 lat= 和 lng= 方法来验证输入

于 2012-10-10T03:29:22.633 回答