0

我正在编写一个 Rails 应用程序,其中有一个模型可以采取某些措施(身高、体重、颈围等)

我希望它适用于公制和英制测量系统。

我的模型有一个 measure_unit 属性,可以是公制或英制。所有的度量都将存储在公制数据库中。

我使用 simple_form gem,我不知道如何实现视图,以便如果用户使用英制系统,他的数据会即时转换。

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

一种解决方案是将隐藏字段传递回控制器,指示传递的值是英制的,需要转换为数据库存储的度量。

因此,您可以简单地使用默认为公制的单个输入,而不是为公制和英制测量提供不同的输入,并且您必须检测非默认(英制):

<%= 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 回答