LWRP 领导者 "undefined method 'checkname' for nil:NilClass"
Chef LWRP "undefined method 'checkname' for nil:NilClass"
我正在尝试为 Chef 食谱编写 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_current_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
非常感谢任何帮助。
所以我在#chef 上得到了答案:
<@coderanger> Sammitch: Use current_resource, not @current_resource
< Sammitch> it's passed in as an instance var?
<@coderanger> Sammitch: No, its actually a method on Provider
<@coderanger> as is new_resource
<@coderanger> the issue is that the block on a resource is evaluated against the resource object
<@coderanger> So in there, @foo is looking at an ivar on the new resource object
<@coderanger> _but_ there is some magic
<@coderanger> Chef::Resource has a method_missing to forward unknown method calls to the enclosing provider
<@coderanger> So #current_resource gets forwarded up for you
<@coderanger> Basically never use the ivar form
<@coderanger> Always new_resource and current_resource instead
<@coderanger> and it will mostly JFW
就 Ruby 和 Chef 而言,我还很新手,所以只有 20% 对 我 有意义,但我修改了我的代码到下面并且有效:
def create_check
cookbook_file get_check_filename(@current_resource.checkname) do
source "checks/#{current_resource.checkname}" # removed the @
mode '0644'
action :create
end
end
您通常必须将方法放在 () 中的“#{}”中
示例:
"#{method}" # does not work
"#{(method)}" # works
a = method; "#{a}" # works too
我正在尝试为 Chef 食谱编写 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_current_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
非常感谢任何帮助。
所以我在#chef 上得到了答案:
<@coderanger> Sammitch: Use current_resource, not @current_resource
< Sammitch> it's passed in as an instance var?
<@coderanger> Sammitch: No, its actually a method on Provider
<@coderanger> as is new_resource
<@coderanger> the issue is that the block on a resource is evaluated against the resource object
<@coderanger> So in there, @foo is looking at an ivar on the new resource object
<@coderanger> _but_ there is some magic
<@coderanger> Chef::Resource has a method_missing to forward unknown method calls to the enclosing provider
<@coderanger> So #current_resource gets forwarded up for you
<@coderanger> Basically never use the ivar form
<@coderanger> Always new_resource and current_resource instead
<@coderanger> and it will mostly JFW
就 Ruby 和 Chef 而言,我还很新手,所以只有 20% 对 我 有意义,但我修改了我的代码到下面并且有效:
def create_check
cookbook_file get_check_filename(@current_resource.checkname) do
source "checks/#{current_resource.checkname}" # removed the @
mode '0644'
action :create
end
end
您通常必须将方法放在 () 中的“#{}”中
示例:
"#{method}" # does not work
"#{(method)}" # works
a = method; "#{a}" # works too