2010-01-10 3 views
2

양식 필드에서 부동 형식을 제어하는 ​​방법이 있습니까?form_for 내의 float 사용자 정의 서식

모듈러스가 0이면 정수처럼 float을 포맷하고 그렇지 않으면 float을 그대로 표시합니다. 이 형식 지정을 수행하기 위해 모델 접근자를 무효화했습니다. 편집 양식이로드되면

, 나는 다음과 같은 변환을하고 싶습니다 :

stored value | accessor returns | form field shows 
--------------------------------------------------- 
1.0   | 1    | 1 
1.5   | 1.5    | 1.5 

그러나, form_for 그대로하여 부동 소수점을 표시, 직접 속성을 액세스 할 것으로 보인다.

이 문제를 해결하는 방법에 대한 아이디어가 있으십니까? 감사.

<%= f.text_field :field_attribute, :value => format_method(f.object.field_attribute) %> 

format_method가 그런 식으로 액세스 할 때 서식을 대체 할 모델 내에서 사용하는 어떤 방법 :

답변

0

난 당신이 이런 일을 할 때 작동합니다 믿는다.

def myfloat 
    if @myfloat == @myfloat.to_i 
    @myfloat.to_i 
    else 
    @myfloat 
    end 
end 

이제 반환 값이 올바르게 양식 서식하고 응용 프로그램에서 계속 사용할 :

+0

뷰 계층에 논리 서식을 유지하기 때문에이 작업을 일찍 수행하는 것이 고려되었지만 형식으로 모델에 넣는 것이 더 좋을 수도 있으므로 뷰에서 복제 할 필요가 없습니다.하지만 부분적인 것이 무엇인지를 짐작하십시오. 이 솔루션을 사용하겠습니다. 감사! – cotopaxi

1

는이 같은 속성 리더, 뭔가를 오버라이드 (override) 할 수있다. 당신이 "원시"값을 얻을 수 read_attribute를 사용하는 경우

+1

그래, 내 모델에는 이미 그런 것이있다. 하지만 내 질문은 어떻게 재정의 속성 판독기를 사용하려면 form_for 얻을 수 있습니까? 그것은 read_attribute 또는 뭔가를 사용하는 것 같다. – cotopaxi

+0

나는 read_attribute가 사용되지 않는다고 생각합니다. http://ar.rubyonrails.org/classes/ActiveRecord/Base.html의 '기본 접근 자 덮어 쓰기'에 따르면, 필자가 설명한 방법은 특별한 동작이 필요할 때 사용해야합니다. 당신 상황에있는 것 같습니다. – Veger

+0

이 방법을 사용하면 좋겠지 만 text_field 도우미 메서드는 값을 직접 가져옵니다 (즉 접근자를 호출하지 않음). – cotopaxi

0

Veger의 솔루션은 작동합니다 : 정수로 수레를 비교할 때 언제나

def myfloat 
    raw = read_attribute(:myfloat) 
    if raw == raw.to_i 
    raw.to_i 
    else 
    raw 
    end 
end 

을, 당신은 반올림에주의 할 것.

0

respond_to? value_before_type_cast 호출을 중지시키는 모델

def respond_to?(*args) 
    if args.first.to_s == "my_float_before_type_cast" 
    false 
    else 
    super 
    end 
end 

그리고는 당신은 또한 필요

def my_float 
    raw = read_attribute(:my_float) 
    if raw == raw.to_i 
    raw.to_i 
    else 
    raw 
    end 
end 
2

이전에 언급 한 바와 같이 작동하지 않습니다 form_for

def my_float 
    raw = read_attribute(:my_float) 
    if raw == raw.to_i 
    raw.to_i 
    else 
    raw 
    end 
end 

사용. 여러 번 시도했습니다. IMHO는 레일이있는 심각한 설계 문제 중 하나입니다. 일반적으로보기에서 모델에 대한 직접적인 (조용한) 액세스 권한은 없습니다.

관련 문제