繁体   English   中英

Rails4:NoMethodError /未定义的方法'*'为nil:NilClass

[英]Rails4: NoMethodError / undefined method `*' for nil:NilClass

在我的sale.rb模型中,我想检查表单是否为“价格”列提交了一个值。 如果“ price”为零(如果没有任何内容通过表单提交,则应该为零),则应从另一个表中获取该值。 但是,每当我尝试提交表单时, NoMethodError in SalesController#create错误中都会出现NoMethodError in SalesController#create并且该行突出显示:

write_attribute(:price,price * Quantity.to_f)除非被破坏?

这是我的代码:

class Sale < ActiveRecord::Base
 before_create :price

  def price
    if price = nil
      mrr = Warehouse.where(:product => self.product).pluck(:mrr).shift.strip.sub(',', '.').to_f
      write_attribute(:price, mrr * quantity.to_f) unless destroyed?
    else
      write_attribute(:price, price * quantity.to_f) unless destroyed?
    end
  end
end

提前致谢!

您的支票price为零是错误的。 您应该使用

if price == nil

要么

if price.nil?

一些随机提示:1.避免零检查。 Rails ActiveSupport库可以轻松修补present?猴子补丁对象present? 方法,它提供了更有意义的方式来确保您的对象在该术语的广义上不为空白。 例如,HTML表单对空引用( nil )没有任何特殊表示,并且可能会提交空字符串''

  1. 花一些时间来学习基本的(非Rails)Ruby。 您应该了解“读者”和“作家”之间的区别。

  2. mrr = Warehouse.where(:product => self.product).pluck(:mrr).shift.strip.sub(',', '.').to_f您或任何其他开发人员将浪费多少秒来尝试弄清楚这到底是怎么回事? 什么是mrr 你为什么要shift.strip.sub呢? 我觉得您的数据库架构在这里可能是错误的。 如果是项目成本,则将其存储在decimal列中。 这引出我的下一个观点...

  3. 从未将价格存储为浮动价格。 浮点数容易出现舍入误差,因为某些小数可能需要无数个数来表示而不进行舍入,并且计算机自然不会很好地处理无限数。 基于二进制的计算机中的十进制浮点数可能会更加棘手。 现在,小数舍入误差趋于累积。 一分钱最终变成一分钱,几分钱累积到美元,并且在大型生产应用程序中超过一年,这可能是一些不可忽略的数额,并且当您需要向以下公司报告时,公司的会计部门会让您的生活痛苦不堪您国家的税务机关。

     def price=(value) value = mrr_from_warehouse if value.blank? # mrr_from_warehouse is your long query extracted to separate instance method super(value * quantity.to_f) # I doubt destroyed? method makes sense here end 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM