Ruby 厨师长LWRP“;未定义的方法';检查名称';对于nil:NilClass“;

Ruby 厨师长LWRP“;未定义的方法';检查名称';对于nil:NilClass“;,ruby,chef-infra,lwrp,Ruby,Chef Infra,Lwrp,我正试图为厨师烹饪书编写LWRP,但遇到了一个奇怪的问题,这个属性在一行上似乎完全有效,而在下一行上则是nil 从提供程序代码中,source行出现错误: def create_check cookbook_file get_check_filename(@current_resource.checkname) do source "checks/#{@current_resource.checkname}" # undefined method `checkname' for n

我正试图为厨师烹饪书编写LWRP,但遇到了一个奇怪的问题,这个属性在一行上似乎完全有效,而在下一行上则是
nil

从提供程序代码中,
source
行出现错误:

def create_check
  cookbook_file get_check_filename(@current_resource.checkname) do
    source  "checks/#{@current_resource.checkname}" # undefined method `checkname' for nil:NilClass
    mode    '0644'
    action  :create
  end
end
load\u current\u resource
方法只是为了显示它已初始化:

def load_current_resource
  @current_resource = Chef::Resource::OmdCheck.new(@new_resource_name)
  @current_resource.checkname(@new_resource.checkname) # right here!
  @current_resource.sitename(@new_resource.sitename)
  @current_resource.sitecfgroot(sprintf(CMK_CFGROOT_FRM, @new_resource.sitename))
  @current_resource.perfometer(@new_resource.perfometer)
  @current_resource.pnptemplate(@new_resource.pnptemplate)

  @current_resource.exists = check_exists?(@current_resource.checkname)
end
非常感谢您的帮助。

因此我得到了关于“厨师长:

Sammitch:使用当前资源,而不是@current\u资源
它作为一个实例变量传入?
Sammitch:不,它实际上是提供程序上的一个方法
这是新的资源
问题是资源上的块是根据资源对象计算的
在这里,@foo正在查看新资源对象上的ivar
_但是有一些魔力
Resource缺少将未知方法调用转发给封闭提供程序的方法
所以#当前的#u资源会被转发给您
基本上从不使用ivar表格
始终使用新资源和当前资源
它将主要是JFW
就Ruby和Chef而言,我是相当绿色的,所以对我来说只有20%是有意义的,但我修改了我的代码,如下所示:

def创建检查
cookbook\u file get\u check\u filename(@current\u resource.checkname)do
source“checks/#{current_resource.checkname}”删除了@
模式'0644'
行动:创建
结束
结束

通常必须在()中的“#{}”中放入方法
示例:

"#{method}"        # does not work
"#{(method)}"      # works
a = method; "#{a}" # works too

很难判断
get\u check\u filename(@current\u resource.checkname)
在没有看到整个提供者的情况下会做什么。诺亚是对的,你应该是当前资源,而不是当前资源。