0

特定の測定値(高さ、重量、neck_circumferenceなど)を実行するモデルがあるRailsアプリを作成しています。

メートル法と単位系の両方で機能するようにしたいと思います。

私のモデルには、メートル法またはインペリアル法の両方の可能性があるmeasure_unit属性があります。すべての測定値は、メートル法のデータベースに保存されます。

私はsimple_formgemを使用していますが、ユーザーがインペリアルシステムを使用した場合にデータがオンザフライで変換されるように、ビューを実装する方法がわかりません。

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

どうすれば空白を埋めることができますか?

編集-実用的な解決策を見つけました

「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 %>  
4

1 に答える 1

1

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
于 2012-12-11T18:30:35.233 に答える