厨师属性“没有将字符串隐式转换为整数”
Posted
技术标签:
【中文标题】厨师属性“没有将字符串隐式转换为整数”【英文标题】:Chef attributes "no implicit conversion of String into Integer" 【发布时间】:2014-06-06 14:03:12 【问题描述】:我正在编写一个厨师食谱,它只是创建一个数据库配置文件,但我很难简单地访问属性。我为每个实例部署了一些 php 应用程序,并且 OpsWorks 对每个人都使用相同的配方,因此我在属性文件中有一些不同的设置。
属性/数据库设置.rb
# API
default[:api][:path] = 'app/config/database.php';
default[:api][:host] = 'test';
default[:api][:database] = 'test';
default[:api][:username] = 'test';
default[:api][:password] = 'test';
食谱/数据库设置.rb
Chef::Log.info("Database settings!");
node[:deploy].each do |application, deploy|
if node.has_key?(application)
Chef::Log.info("Application: #application");
path = node["api"]["path"]; # ERROR HAPPENING HERE
Chef::Log.info("Path: #path");
template path do
source "database.erb"
mode 0440
variables(
:host => node["api"]["host"],
:database => node["api"]["database"],
:username => node["api"]["username"],
:password => node["api"]["password"]
)
end
end
end
我得到的错误是no implicit conversion of String into Integer
。我已经尝试以我能想到的各种方式创建和访问设置,例如...
node[:api][:path] # no implicit conversion of Symbol into Integer
node['api']['path'] # no implicit conversion of String into Integer
node[:api].path # undefined method `path' for #<Chef::Node::ImmutableArray:0x007fa4a71086e8>
node[application][:path] # no implicit conversion of Symbol into Integer
我确定我在这里做错了一些非常明显的事情,但我已经尝试了我能想到的一切,但我似乎无法找到任何方法让它工作?!理想情况下,我想使用一个变量,我可以"api"
,但使用 if/else 对于 3 个应用程序来说不会太糟糕......
【问题讨论】:
试试node.default[:api][:path]
我在使用node.default
时遇到同样的错误,例如:path = node.default[application][:path]; # no implicit conversion of Symbol into Integer
能否打印出node.default
和node.default[application]
是什么?
好吧,这可能已经发现了这个问题,这可能不是你的意思,但我做了node.default[application].inspect
,它返回了一个不同配方的路径数组(["public/tmp_uploads","app/storage/archives"...]
),但两者都使用了@ 987654333@键,属性不限同名配方吗?我会尝试更改密钥,然后再试一次。
【参考方案1】:
当您尝试访问一个认为它是哈希但实际上是数组的对象时,这是一个常见的错误。事实上,从您的一个错误中,可以看出node["api"]
是Chef::Node::ImmutableArray
。
【讨论】:
我是一个完整的 ruby 新手,所以我不太确定有什么区别,但根据 aws 文档,我应该可以通过[:api][:path]
访问它,除非这只是没有工作docs.aws.amazon.com/opsworks/latest/userguide/…【参考方案2】:
好吧,问题并不是我错误地访问了配置,而是不同的属性文件都被合并到一个配置中,我没有意识到这一点。 我有这些配置文件...
属性/database_settings.rb
default[:api][:path] = 'app/config/database.php';
default[:api][:username] = 'example';
attributes/writable_directories.rb
default[:api] = ['public/uploads', 'storage/cache'];
当我尝试访问default[:api][:path]
时,我实际上是在访问目录数组,而这似乎覆盖了数据库设置属性。将这些移动到 default[:directories][:api]
和 default[:database][:api][:path]
等中修复了这个问题。
【讨论】:
【参考方案3】:请注意,如果您不小心在“节点”和索引它的项目之间输入了空格,您也会收到此错误:
node[:foo][:bar]
会起作用,而
node [:foo][:bar]
会抛出这个异常。可能很难发现。
【讨论】:
以上是关于厨师属性“没有将字符串隐式转换为整数”的主要内容,如果未能解决你的问题,请参考以下文章
错误128无法将类型“string”隐式转换为“System.Windows.Forms.DataGridViewTextBoxColumn”