【问题标题】:Rails: undefined method `*' for nil:NilClassRails:nil:NilClass 的未定义方法“*”
【发布时间】:2020-03-08 00:14:55
【问题描述】:

我是 Rails 的新手,想在模型中做基本的数学运算,以从一些数学运算中获得售价。我正在产品模型中写一个简单的方程。就是这样:

 def selling_price
  foodio_price + (foodio_price*@@tax) + @@dc
 end

但它为 nil:NilClass 提供错误未定义的方法 `*'。它不识别 * 用于乘法以及 + 用于求和。谁能告诉我这里出了什么问题?

【问题讨论】:

  • foodio_price 来自哪里?这是一个方法还是一个 ActiveRecord 属性或其他东西?
  • @muistooshort foodio_price 来自产品表单。

标签: ruby-on-rails ruby ruby-on-rails-3 math


【解决方案1】:

该函数中的一个变量(如foodio_price@@tax)是nil。 Ruby 中的一切都是一个对象,甚至包括nil,在其他编程语言中你可能知道它为nullnil 的每个实例都继承自类 NilClass。因此,nil:NilClass 指的是nil 的一个实例,它的类型是NilClass

要调试此问题,您可以通过添加 puts 语句来检查这些值中的哪一个(或三个)是 nil


我的猜测是@@tax@@dc 都是nil。您很少需要在 Rails 中使用这些类变量。我建议只将taxdc 声明为常量,所以类似
TAX = 0.09
DC = 0.10

在你的类文件的某个地方。


对于 foodio_pricenil 参数的默认值
def selling_price foodio_price
  if foodio_price.nil? return 0.0
  foodio_price + (foodio_price*@@tax) + @@dc
end

【讨论】:

  • 是的,你是对的。 Foodioprice 为零。我已经定义了税和直流。但是作为 Foodio_price 来自用户的输入,它将为零。那该怎么做呢?
  • 如果 foodio_price 为零,请按照我的编辑建议执行操作。
【解决方案2】:

错误是说 foodio_price 是来自 NilClass 类的对象

在伪代码中,foodio_price = nil

您的变量 foodio_price 尚未实例化(还没有任何值)

你应该试试这个

def selling_price(foodio_price)
  foodio_price + (foodio_price*@@tax) + @@dc
end

在你代码的其他地方,你调用函数selling_price,你将参数foodio_price传递给它

【讨论】:

    【解决方案3】:

    成功了。将我的模型更改为:

     def selling_price
      self.foodio_price  ||= 0.0  
      foodio_price + (foodio_price*@@tax) + @@dc
     end
    

    【讨论】:

      【解决方案4】:
      foodio_price + ((foodio_price || 1)*(@@tax || 1|) + (@@dc || 0)
      

      试试这个

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-09-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-17
        • 2013-06-11
        • 2010-12-30
        相关资源
        最近更新 更多