Rails 中 nil:NilClass 的未定义方法“set”,即使类似的代码在 irb 中有效

undefined method `set' for nil:NilClass in Rails even though similar code works in irb

以下代码在 IRB 中运行良好(交互式 Ruby Shell): 需要 'prometheus/client'

prometheus = Prometheus::Client.registry
begin
  @requests = prometheus.gauge(:demo, 'Random number selected for this users turn.')
rescue Prometheus::Client::Registry::AlreadyRegisteredError => e
end
@requests.set({name: "test"}, 123)
test =  @requests.get name: "test"
    puts 'output: ' + test.to_s

2.4.0 :018 > 加载 'test.rb' 输出:123.0 => 真 2.4.0 :019 >

但是,当我将相同的代码放入 Rails 控制器上的 Ruby 时,用户第二次使用该应用程序时,返回以下错误: nil:NilClass

的未定义方法“set”

有人可以告诉我我做错了什么吗?谢谢。

require 'prometheus/client'

class RandomnumbersController < ApplicationController
  def index
    @randomnumbers = Randomnumber.order('number DESC').limit(8)
    @counter = 0
  end

  def show
    @randomnumber = Randomnumber.find(params[:id])
  end

  def new
  end

  def create
    @randomnumber = Randomnumber.new(randomnumber_params)

    prometheus = Prometheus::Client.registry
    begin
      @requests = prometheus.gauge(:demo, 'Random number selected for this users turn.')
    rescue Prometheus::Client::Registry::AlreadyRegisteredError => e
    end
    @requests.set({name: "test"}, 123)
    test =  @requests.get name: "test"

    @randomnumber.save
    redirect_to @randomnumber
  end

  private
  def randomnumber_params
    params.require(:randomnumber).permit(:name, :number)
  end
end

因为 :demo 参数没有 @requests

当 ORM 在数据库中找不到任何信息时,它 returns nil (NilClass)

并且您正在尝试做:

@requests.set({name: "test"}, 123)

它的解释如下:

nil.set({name: "test"}, 123)
  • 为什么第二次出现这个问题?
  • cuz 您的代码将 @requests name 属性更改为 test 并且看起来 :demo 不是 test 或者可能在您应用的另一部分您是数据库中的 replacing/deleting 数据:@requests = prometheus.gauge(:demo, 'Random number selected for this users turn.') 到 return nil

解法:

在代码级别添加此修复以避免此类不可预测的情况(检查 nil):

unless @requests.nil?
  @requests.set({name: "test"}, 123)
  test =  @requests.get name: "test"
end