nil:NilClass Rails 的未定义方法“split”

undefined method `split' for nil:NilClass Rails

我正在 Rails 4.2.2 和 Ruby 2.2.2 中构建一个简单的资产管理器应用程序。在我的 asset 模型中,我使用带有 before_create 的回调来调用函数 generate_asset_number,就像这样

def generate_asset_number
        company = "AMS"
       if Asset.count == 0
        self.asset_number = "#{company}-00001"
       else
        last = Asset.last.asset_number
       end
        number = last.split('-')[1].to_i
        number += 1
        self.asset_number = company + '-' + "%05d" % number
      end
    end

如您所见,我将公司变量设置为字符串,评估 Asset.count 是否为 0,然后 return 字符串 "AMS-00001",如果 Asset.count 不是 0 那么我将 last 分配给 Asset.last.asset_number 以提取序列中的最后一个数字。

我被绊倒的地方是将数字变量设置为 return 最后一个事件编号并对其调用 split 以提取数组的第二部分并转换为整数,以便我可以递增它.

当我从控制台 运行 执行此操作或尝试在视图中创建新记录时,出现以下错误:

undefined method拆分为 nil:NilClass`

我确定我的语法不对,因为我更像是一个 Ruby Jr.

如果有人能帮助解释我需要做什么来重构并使这项工作正常进行,我将不胜感激。如果您需要更多信息或者我的问题不清楚,请告诉我。

undefined method split' for nil:NilClass`

错误是因为 last 变量的生命周期已在 if-else 循环中结束,而您正试图访问 last 外部 if-else 这一行中的循环 number = last.split('-')[1].to_i。你需要像这样调整你的代码

def generate_asset_number
  company = "AMS"
  if Asset.count == 0
    self.asset_number = "#{company}-00001"
  else
    last = Asset.last.asset_number
    number = last.split('-')[1].to_i
    number += 1
    self.asset_number = company + '-' + "%05d" % number
  end
end