我阅读了一些关于Yaml或yml文件格式的快速教程.我制作了一个yaml文档来表示我的数据.我看到了一些 ruby教程,告诉你如何用 ruby提取yaml.不幸的是,他们只是打印整个数据或只是键和值.它不
yaml文件 –
dev: game1: server1: url: 'dev-game1-a-srv01.gamer.com' log-path: '/srv/logs' server2: url: 'dev-game1-a-srv02.gamer.com' log-path: '/srv/logs' game2: server1: url: 'dev-game2-a-srv01.gamer.com' log-path: '/srv/logs' server2: url: 'dev-game2-b-srv02.gamer.com' log-path: '/srv/logs' server3: url: 'dev-game2-b-srv01.gamer.com' log-path: '/srv/logs' prod: etc....
如何使用ruby代码选择dev,game2,server 3,url?
使用下面的代码,我得到一个例外 –
require 'yaml' def server_info path = 'C:\Code\demo-srv.yml' yml = YAML::load(File.open(path)) game2 = yml['dev']['game2'] game2.each{|server| if server['server3'] puts server['server3']['url'] end } end server_info
错误 –
server.rb:8:in `[]': can't convert String into Integer (TypeError) from server.rb:8:in `server_info' from server.rb:7:in `each' from server.rb:7:in `server_info' from server.rb:14您是否定义了yaml-data,或者您只是现有yaml文件的使用者?
如果你定义了它,我会用Hash替换服务器数组(参见缺少的 – 在服务器名称之前):
dev: game1: server1: url: 'dev-game1-a-srv01.gamer.com' log-path: '/srv/logs' server2: url: 'dev-game1-a-srv02.gamer.com' log-path: '/srv/logs' game2: server1: url: 'dev-game2-a-srv01.gamer.com' log-path: '/srv/logs' server2: url: 'dev-game2-b-srv02.gamer.com' log-path: '/srv/logs' server3: url: 'dev-game2-b-srv01.gamer.com' log-path: '/srv/logs'
然后你可以尝试yml [‘dev’] [‘game2’] [‘server3’] [‘url’].
注意:没有检查丢失/错误的数据.如果game2的条目错过,此代码将引发异常.
所以,也许你应该做类似的事情
if yml['dev'] and yml['dev'].kind_of?(Hash) if yml['dev']['game2'] and .... ... else puts "No dev-branch defined" end
否则,您可以尝试以下方式:
def server_info yml = YAML::load(DATA) yml['dev']['game2'].each{|server| if server['server3'] p server['server3']['url'] end } end
注意(两种解决方案):
没有检查丢失/错误的数据.这里检查服务器[‘server3’]的存在.对于实际代码,您还应该检查dev和game2数据的存在.
编辑后继续回答:
如果您有一个数组但是期望一个哈希并且您尝试使用字符串访问数组元素,则通常会抛出将String转换为Integer的错误.
您可以尝试以下代码.有两个变化:
>第8行包含服务器的输出 – 你会看到它是一个数组,没有哈希.
>第9行10:数组由两个元素检查和使用(通过#first和#last)
require 'yaml' def server_info path = 'C:\Code\demo-srv.yml' #~ yml = YAML::load(File.open(path)) yml = YAML::load(DATA) game2 = yml['dev']['game2'] game2.each{|server| p server #-> you get an array if server.first == 'server3' puts server.last['url'] end } end server_info
文件 –
dev: game1: server1: url: 'dev-game1-a-srv01.gamer.com' log-path: '/srv/logs' server2: url: 'dev-game1-a-srv02.gamer.com' log-path: '/srv/logs' game2: server1: url: 'dev-game2-a-srv01.gamer.com' log-path: '/srv/logs' server2: url: 'dev-game2-b-srv02.gamer.com' log-path: '/srv/logs' server3: url: 'dev-game2-b-srv01.gamer.com' log-path: '/srv/logs'