Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Ruby:循环和调用关联数组(TypeError没有将字符串隐式转换为整数)_Ruby On Rails_Arrays_Ruby_Chef Infra - Fatal编程技术网

Ruby on rails Ruby:循环和调用关联数组(TypeError没有将字符串隐式转换为整数)

Ruby on rails Ruby:循环和调用关联数组(TypeError没有将字符串隐式转换为整数),ruby-on-rails,arrays,ruby,chef-infra,Ruby On Rails,Arrays,Ruby,Chef Infra,我有一段代码: node['nginx'][0]['server_name']='black.domain.com' node['nginx'][0]['app_server']='http://10.50.0.163:8090' node['nginx'][0]['redirect_path']='/mesh' node['nginx'][1]['server_name']='red.domain.com' node['nginx'][1]['app_server']='http://10.

我有一段代码:

node['nginx'][0]['server_name']='black.domain.com'
node['nginx'][0]['app_server']='http://10.50.0.163:8090'
node['nginx'][0]['redirect_path']='/mesh'

node['nginx'][1]['server_name']='red.domain.com'
node['nginx'][1]['app_server']='http://10.50.0.163:8090'
node['nginx'][1]['redirect_path']='/mesh'

node.default['nginx'].each do |key, value|
    value.each do |prop|
            Chef::Log.info prop['app_server']       
    end
end
就像书名上说的那样:

 21>>       Chef::Log.info prop['app_server']
我的问题是如何循环通过这个关联数组

最好的,
-Iulian

您的循环应该如下所示:

node.default['nginx'].each do |node_properties|
  Chef::Log.info node_properties['app_server']
end
您可以像这样循环通过节点['nginx']。我不知道什么节点。默认值['nginx']应该是

node['nginx'].each do |num, hash|
  #on the first iteration: 
  #  num = 0
  #  hash = {'server_name' => 'black.domain.com', 'app_server' => 'http://10.50.0.163:8090', 'redirect_path' => '/mesh'}
  #on the second iteration
  #  num = 1
  #  hash = {'server_name' => 'red.domain.com', 'app_server' => 'http://10.50.0.163:8090', 'redirect_path' => '/mesh'}
  #now you can do what you want with the data eg
  Chef::Log.info hash['app_server'] 
end

虽然代码非常好,但我建议您另一种构造属性的方法:使用哈希而不是数组:

node['nginx']['black_1']['server_name'] = 'black1.domain.com'
node['nginx']['black_1']['app_server'] = 'http://10.50.0.163:8090'
node['nginx']['black_1']['redirect_path'] = '/mesh'

node['nginx']['black_2']['server_name'] = 'black2.domain.com'
node['nginx']['black_2']['app_server'] = 'http://10.50.0.163:8090'
node['nginx']['black_2']['redirect_path'] = '/mesh'
您可以使用以下方法循环:

node['nginx'].each do |site_name, node_properties|
  Chef::Log.info node_properties['app_server']
end
原因:

在chef属性中删除/操作数组元素非常困难,例如使用节点属性或在包装器烹饪书中。假设您需要更改某个站点的ip地址或端口,例如,在包装器手册中,为某个阶段/测试环境部署设置。您需要知道记录在数组中的位置,或者必须循环到整个数组并查找(例如服务器名称)以匹配正确的条目

详情:


node.default['nginx']的值是多少?它没有被分配任何东西。如果没有定义,我希望你在调用它时会得到一个错误,或者是零。谢谢你,但是我得到了相同的东西。所以如何输出这些值?不过,您应该知道,如果hash={'server\u name'=>'red.domain.com','app\u server'=>'http://10.50.0.163:8090“,”redirect_path'=>“/mesh'}如果你想要'app_server'值,你可以说hash['app_server']-这只是基本的hash访问。太好了,你可以推荐任何关于这个主题的ruby页面吗?谢谢,-这是一个非常基本的语言特性,如果你不知道,我建议你从头开始。