从控制器

时间:2017-09-14 14:09:15

标签: ruby-on-rails

对不起,如果这看起来像一个非常容易(太简单)的问题,但我正在努力寻找解决这个问题的方法。

我需要根据进入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 ....)提供给方法?

很抱歉,如果这个问题听起来很愚蠢,但我还在学习。

提前感谢一百万人!

2 个答案:

答案 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

这为您提供了一个很好的机会来描述整体计算,并使其更容易一目了然,并在必要时深入研究。