我有一个使用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
字段输入: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
我必须做些什么才能让它发挥作用?感谢。
答案 0 :(得分:0)
如果Post.lat和Post.long字段具有浮点类型,当您从表单输入中分配字符串值时,Rails会将它们转换为Float。
这些是你可以做出的一些改变:
- 在分配值之前验证控制器中的表格输入;
- 将数据类型更改为String并提供将值作为Float获取的方法;
- 更改lat =和lng =方法以验证输入
答案 1 :(得分: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)形式