【问题标题】:Rendering a simple calculation from a controller从控制器渲染一个简单的计算
【发布时间】:2018-02-23 13:42:34
【问题描述】:

如果这看起来是一个非常简单(太简单)的问题,我很抱歉,但我正在努力寻找解决这个问题的方法。

我需要根据输入身体模型的数据计算基础代谢率,并将其呈现在我的显示视图中。问题是我可以在视图中运行计算,但当然,这不是正确的方法。

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

此代码 sn-p 位于提供 Body#show 视图的部分中。当然,我想在控制器级别完成此操作。

所以我在 body_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 视图时,如下所示:&lt;%= @bmr %&gt; 什么都没有显示。此外,在控制台中输入 @bmr 会返回 NIL。如何将 Body 属性(体重、年龄、身高……)输入到方法中?

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

提前一百万谢谢!

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    您可以将 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 等于最后一个 body 对象

    从您的角度来看,您可以将结果称为如下

    show.html.erb

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

    【讨论】:

    • 为什么是用户?如果我们将它移动到模型中,它应该在 Body 中。
    • 我正在考虑这个@user = User.find(params[:user_id]) 和@user.bodies 里面的bmr 方法,虽然控制器是Body,但是他的show 方法指的是@user。
    • 我的意思是,它应该是@user.bodies.last.bmr(并且有@user.bmr 代表bodies.last
    • @SergioTulentsev 哇,谢谢,很好的重构捕获。让我试着编辑一下
    • ? self 是多余的,顺便说一句。
    【解决方案2】:

    我会给你一些建议,让你更优雅地解决这个问题。将问题分解为更易于管理的部分,并尽量远离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
    

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

    【讨论】:

      猜你喜欢
      • 2015-10-25
      • 2015-07-31
      • 2014-05-28
      • 2012-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-19
      相关资源
      最近更新 更多