2012-10-10 10 views
0

Google지도 지오 코더로 위도와 경도를 자동으로 사용하는 앱이 있습니다. 다른 필드 유효성 검사와 결합하도록 사용자 정의 유효성 검사를 작성하려고합니다. 다음은 내 코드입니다 : 내 Post 형태에서문자열이 float인지 확인하십시오. 0.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 

, 내가 :lat 필드 asdf를 입력 불을 지르고를 사용, 그것은 valid_float? 방법을 찾을 수 없다는 오류를 반환했습니다.

나는 다음 몇 가지 디버깅을 시도 :

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

내가 그것을 to_s0.0 될 것 :lat 필드에 입력 한 숫자 이외의 문자처럼 보인다. 그러나 to_svalid_float?을 작동시키는 유일한 방법입니다. to_s이 모든 텍스트를 0.0으로 변환하는 이유는 무엇입니까? 이

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

내가해야 할 작업하려면 :

는 또한 테스트에 rails c을 했습니까? 감사.

+0

최신 디자인과 LNG 필드는 포스트 모델의 필드입니다? 유형이 부동 (float)하면 Rails는 값을 할당 할 때 해당 유형을 변환합니다. – zoli

+0

예, 유형이 부동입니다. 그래서 모든 캐릭터가 플로트로 변환되는 이유는 무엇입니까? – Victor

+0

아마도. 값을 지정하기 전에 컨트롤러에서 양식 입력의 유효성을 검사 할 수 있습니다. 데이터 유형을 String으로 변경하고 값을 Float으로 가져 오는 메소드를 제공하십시오. 또는 입력을 확인하기 위해 lat = 및 lng = 메소드를 변경하십시오. – zoli

답변

0

Post.lat 및 Post.long 필드에 부동 소수점 유형이있는 경우 양식 입력에서 문자열 값을 할당하면 Rails가이를 Float로 변환합니다.
변경 가능한 사항은 다음과 같습니다.
- 값을 할당하기 전에 컨트롤러에서 양식 입력의 유효성을 검사하십시오.
- 데이터 형식을 String으로 변경하고 값을 Float로 가져 오는 메서드를 제공합니다.
는 - 이것은 당신이 생각했던 방식으로 작동하지 않습니다

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

입력을 검증하기 위해 위도 = 및 LNG = 방법을 변경합니다. 괄호 사이의 표현식이 먼저 평가 된 다음 결과에 valid_float?이 호출됩니다. 루비에서 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)의 ​​형태

+0

고마워,하지만 문제는 텍스트에서 0.0으로 변환하는 것에있다. – Victor

관련 문제