编写一种简单地将对象乘以某种东西的方法

时间:2013-08-09 20:25:44

标签: ruby-on-rails ruby

我正在尝试将我的网站前端的一串数字从英制转换为公制,具体取决于用户是否已将其measurement_units设置为“metric”或“imperial”

我可以@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中创建一个辅助方法。这不正确吗?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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。

答案 2 :(得分:0)

假设@myWeight是Float值,您似乎正在寻找如何修补补丁。签入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服务器以重新初始化。