2012-12-11 4 views
0

특정 조치 (신장, 체중, neck_circumference 등) 나는 그것이 미터법 측정을 위해 모두를 작업 할simple_form 및 즉시 변환에

소요 모델이있는 곳에 내가 레일 응용 프로그램을 쓰고 있어요 체계.

내 모델에는 미터법이나 영국식 둘 다일 수있는 measure_unit 속성이 있습니다. 모든 측정 값은 미터법으로 데이터베이스에 저장됩니다.

저는 simple_form 보석을 사용합니다. 사용자가 제국 시스템을 사용하면 데이터가 즉시 변환되도록보기를 구현하는 방법에 대한 단서가 없습니다.

<% if @customer.measure_unit.eql? "metric" %>                
    <%= f.input :height %></br>         
<% else %> 
    ... 
<% end %> 

공백을 어떻게 채우나요?

편집 - 발견 작업 솔루션

I는 "height_in_cm"데이터베이스의 항목을두고 "height_in_in"와 같은 가상 속성을 사용하여 결국은 mm에 저장합니다.

def height_in_cm 
    height/10 
    end 

    def height_in_cm=(height) 
    self.height = height.to_f * 10 
    end 

    def height_in_in 
    height * 0.039370 
    end 

    def height_in_in=(height) 
    self.height = height.to_f/0.039370 
    end 

그리고 뷰의 코드 : 값을 나타내는

<% if @customer.measure_unit.eql? "imperial" %> 
    <%= f.input :height_in_in %></br> 
    <% else %>  
    <% if @customer.measure_unit.eql? "metric" %> 
     <%= f.input :height_in_cm %></br> 
    <% end %>  
    <% end %> 

답변

1

하나의 솔루션은 컨트롤러에 다시 숨겨진 필드를 통과하는 것입니다 여기에

는 모델에 대한 코드입니다 통과 된 제국이고 데이타베이스 저장을위한 미터법으로 개조 될 필요가있다.

그래서보다는 단순히 메트릭하는 기본값 단일 입력을 사용할 수 있습니다 메트릭 및 제국 측정을위한 다른 입력을 가진 당신은 (제국) 기본이 아닌에 대한 감지해야 : 지금

<%= f.input :height %></br>         
<%= f.hidden_field :imperial, :value => (@customer.measure_unit.eql? "imperial" ? true : false) %> 

측정 속성을 저장하기 전에 컨트롤러 동작을 수행하십시오.

if params[:imperial] == true 
    #convert imperial measurement to metric (replace @foo with your object) 
    @foo.height = convert_to_metric(params[:height]) 
end 
+0

네, 가능합니다. 그것을 구현하려고합니다. 고맙습니다! – TopperH

+0

당신의 솔루션은 유망스럽게 보였지만 이미 변환 된 측정 값에 대해서도 변환 작업을 다시 계산하는 업데이트 작업을 망쳐 버리는 결과를 낳았습니다. – TopperH