2017-09-14 83 views
0

如果這看起來像一個非常簡單(太簡單)的問題,我很抱歉,但我正在努力找到解決這個問題的方法。從控制器呈現一個簡單的計算

我需要根據數據計算基礎代謝率,並將其輸入到體模型中並將其呈現在我的顯示視圖中。問題是我可以在視圖中運行計算,但當然,這不是一個正確的方法。

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

當嘗試這個簡單的計算結果拉進我的身體#秀視圖像這樣:<%= @bmr %>沒有任何顯示。此外,在控制檯中鍵入@bmr將返回NIL。我如何將Body屬性(Weight,age,height ....)添加到方法中?

對不起,如果這個問題聽起來很愚蠢,但我還在學習。

非常感謝!

回答

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 

您的提醒:自等於最後一具屍體對象

,並從你的觀點,你可以調用結果如下

show.html.erb

<%= @user.bodies.last.bmr %> 
+0

爲什麼用戶?如果我們將它移動到模型中,它應該放在Body中。 –

+0

儘管控制器是Body,但他的show方法引用了@ user,但我正在考慮這@ @ user = User.find(params [:user_id])和@ user.bodies在bmr方法中。 – widjajayd

+0

我的意思是,它應該是'@ user.bodies.last.bmr'(並且'@ user.bmr'委託給'bodies.last') –

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 

這給你一個很好的機會來形容總體算來,使你更容易掌握一目瞭然,並在必要時挖掘。