对不起,如果这看起来像一个非常容易(太简单)的问题,但我正在努力寻找解决这个问题的方法。
我需要根据进入Body模型的数据计算基础代谢率并在我的show视图中渲染它。问题是我可以在视图中运行计算,但当然,这不是一个正确的方法。
<%= ((13.397*@user.bodies.last.weight)+(479.9 * @user.bodies.last.height)-(5.677 * @user.bodies.last.age)+(88.362)) * (1 - (@user.bodies.last.fat / 100.00)) %>
此代码段部分提供Body#show view。当然,我希望在控制器级别完成这项工作。
所以我在我的bodies_controller中编写了一个方法,如下所示:
# Calculate Basal Metabolic Rate for Males
def bmr
@user = User.find(params[:user_id])
@bmr = ((13.397 * @user.bodies.last.weight) + (479.9 *
@user.bodies.last.height) - (5.677 * @user.bodies.last.age) +
88.362) * (1 - (@user.bodies.last.fat / 100.00))
end
当试图将这个简单计算的结果拉到我的Body#show视图中时:<%= @bmr %>
没有显示。此外,在控制台中键入@bmr将返回NIL。如何将Body属性(Weight,age,height ....)提供给方法?
很抱歉,如果这个问题听起来很愚蠢,但我还在学习。
提前感谢一百万人!
答案 0 :(得分:0)
你可以将bmr方法移动到身体模型,如下所示
body.rb
class Body < ApplicationRecord
# your other codes
def bmr
((13.397 * self.weight) +
(479.9 * self.height) -
(5.677 * self.age) + 88.362) *
(1 - (self.fat / 100.00))
end
end
注意:self等于last body object
您可以在视图中调用结果,如下所示
show.html.erb
<%= @user.bodies.last.bmr %>
答案 1 :(得分:0)
我有一些指示可以让你更优雅地解决这个问题。将问题细分为更易于管理的部分,并尽量远离magic numbers。
class Body
def bmr
@bmr ||= Bmr.calculate(self)
end
end
(下面)显然,用这些数字的描述性名称替换num1
等,以便我们了解它们在此计算中的含义。另外,请考虑使用在类顶部定义的常量NUM1
而不是方法。
class Bmr
attr_reader :body
private :body
def initialize(body)
@body = body
end
def self.calculate(body)
new(body).calculate
end
def calculate
((num1 * body.weight) +
(num2 * body.height) -
(num3 * body.age) +
(num4) *
(num5 - (body.fat / 100.00))
end
def num1
13.397
end
def num2
479.9
end
def num3
5.677
end
def num4
88.362
end
def num5
1
end
end
最重要的是,你可以进一步打破内部计算..
def calculated_weight
num1 * body.weight
end
# then
def calculate
calculated_weight + calculated_height - calculated_age
# etc
end
这为您提供了一个很好的机会来描述整体计算,并使其更容易一目了然,并在必要时深入研究。