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
以下代码在 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.')
到 returnnil
解法:
在代码级别添加此修复以避免此类不可预测的情况(检查 nil
):
unless @requests.nil?
@requests.set({name: "test"}, 123)
test = @requests.get name: "test"
end