0

我正在尝试在我的网站前端将一堆数字从英制转换为公制,具体取决于用户是否将他们的 measure_units 设置为“公制”或“英制”

我可以做@myWeight*.45转换数字,但我想做的是写一个这样的帮助方法

def is_imperial?
  if User.measurement_units == 'metric'
    *0.453592
  elsif User.measurement_units == 'imperial'
    *1
  end
end

然后能够做到这一点:@myWeight*.is_imperial?

我只是不确定如何将 分配*value给该方法is_imperial?

谢谢您的帮助!

编辑:

@myWeight 是通过添加多个数字计算得出的浮点数。

我只是想找到一种优雅的方法,如果用户将度量作为measurement_units用户模型字段中的值,则将站点上显示的任何数字转换为度量。

我假设我需要在 application_helper.rb 中创建一个辅助方法。这不正确吗?

4

3 回答 3

2

我想你的意思是这样的:

class User

  def imperial
    f_multiplier = 0.0
    f_multiplier = !!(self.measurement_units == 'metric') ? 0.453592 : 1
    imperial = self.weight * f_multiplier
  end

end

puts @myWeight.imperial
于 2013-08-09T20:34:54.323 回答
1

如果您希望该measurement_units方法基于用户是动态的,那么我认为您需要将其设为实例方法。

修改is_imperial?方法返回正确的数字:

def is_imperial?
  if measurement_units == 'metric'
    0.453592
  elsif measurement_units == 'imperial'
    1
  end
end

然后您可以使用以下方式调用该方法:

@myWeight.send(:*, is_imperial?)

如果 @myWeight 代表一个User对象,您可能必须将其更改为:

@myWeight.weight.send(:*, is_imperial?)

以 ? 结尾的方法 在 Ruby 中预计会返回 true 或 false,因此您应该将方法重命名为 weight_conversion_factor 之类的名称。

于 2013-08-09T20:34:39.803 回答
0

假设@myWeight是浮点值,您似乎正在寻找如何修补补丁。签入 Rails 控制台,@myWeight.class.name返回 Float。

对于 Rails 中的猴子补丁,

创建config/initializers/extensions目录。这是您将存储任何未来猴子修补方法的地方。

创建一个名为floats.rb.

添加以下代码。

class Float
  def is_imperial?
    if User.measurement_units == 'metric'
      self*0.453592
    elsif User.measurement_units == 'imperial'
      self*1
    end
  end
end

确保重新启动 Rails 服务器以重新初始化。

于 2013-08-09T20:39:36.157 回答