我收到了api的请求。参数可以是["3456", "567564"]
(表单数据)或"45643, 45645, 45645"
(json)之类的数组。这些参数直接发送到sql请求。我必须检查用户是否只发送了整数;否则SQL将崩溃:> ERROR: invalid input syntax for integer: "8939f"
。
目前,我有这个:
def valid_group_params?
group_ids_to_add = params[:group]['group_ids_to_add']
group_ids_to_remove = params[:group]['group_ids_to_remove']
if group_ids_to_add && group_ids_to_remove
group_ids = group_ids_to_add + group_ids_to_remove
if group_ids.is_a? Array
group_ids = group_ids * ","
else
group_ids = group_ids_to_add + ',' + group_ids_to_remove
end
group_ids.split(',').all? {|x| x !~ /\D/ }
end
end
但我不喜欢那么多。有没有更好的方法呢?
答案 0 :(得分:3)
只需使用to_i
将字符串转换为整数。
根据官方文件:
忽略有效数字末尾之外的字符。如果 在str的开头没有有效数字,返回0。
例如:
"45643".to_i
# => 45643
"8939f".to_i
# => 8939
"99 red balloons".to_i
# => 99
即使这还不够,您也可以使用正则表达式:
"some1221text"[/\d+/]
# => "1221"
答案 1 :(得分:3)
我不确定我是否理解这个问题,特别是在阅读了其他答案之后。这会有帮助吗?
def all_digits?(params)
case params
when Array
params
when String
params.split /,\s+/
else
# raise exception
end.all? { |e| e =~ /^\d+$/ }
end
to_add = params[:group]['group_ids_to_add']
to_remove = params[:group]['group_ids_to_remove']
to_add && to_remove && all_digits?(to_ad) && all_digits?(to_remove)
案例1
to_add = ["123", "456"]
to_remove = ["789", "0cat"]
to_add && to_remove && all_digits?(to_add) && all_digits?(to_remove)
#=> ["123", "456"] && ["789", "0cat"] && true && false
#=> false
案例2
to_add = "123", "456"
to_remove = "789", "0cat"
to_add && to_remove && all_digits?(to_add) && all_digits?(to_remove)
#=> "123", "456" && "789", "0cat" && true && false
#=> false
答案 2 :(得分:2)
使用to_i
方法。
foo = "3456"
foo.to_i
答案 3 :(得分:2)
使用全局方法Kernel#Integer:
Integer("123") # => 123
Integer(123) # => 123
这很像#to_i,因为它会将字符串转换为整数并保持整数不变。但是,与#to_i不同,如果#Integer的参数不表示整数,则会引发错误:
Integer("abc") # => ArgumentError: invalid value for Integer(): "abc"