【问题标题】:undefined method `split' for nil:NilClass Railsnil:NilClass Rails 的未定义方法“split”
【发布时间】:2015-06-20 15:33:28
【问题描述】:

我正在 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,然后返回字符串“AMS-00001”,如果 Asset.count 不为 0,则我最后分配到 Asset.last.asset_number 拉取序列中的最后一个数字。

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

当我从控制台运行它或尝试在视图中创建新记录时,我收到以下错误:

undefined methodsplit' for nil:NilClass`

我确定我的语法不正确,因为我更像是 Ruby Jr。

如果有人可以帮助解释我需要做些什么来重构和完成这项工作,我将不胜感激。如果您需要更多信息或我的问题不清楚,请告诉我。

【问题讨论】:

    标签: ruby-on-rails ruby split


    【解决方案1】:

    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
    

    【讨论】:

    • 这很好,对不起,这对我来说太早了,我犯了新错误。我在此期间重构了与您的答案类似的内容,但它使用了额外的 if 语句。所以这更干净!非常感谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-06
    • 2015-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多