Ruby / yaml 从 assoc 数组中删除元素

Ruby / yaml delete element from assoc array

大家好,我在 yml 中有数组

 menu:
      primary:
        name: General menu
        -
          text: Home
          addr: index.html
        -
          text: Contact
          addr: contact.html

我有菜单(我创建了变量菜单,因为当我只使用 print ... element['text']... 我从 php 得到类似 var_dump 的东西不仅文本 "Start") 我想删除 foreach 之前的 'name' 元素,但它不起作用:

name = $data['name'][name]['name'] # i need this variable later
$data['menu'][name].delete('name') # it doesnt work
menu = "<ul>"
$data['menu'][name].each do |element|
    menu << "<li><a href=\"#{element['addr']}\">#{element['text']}</a></li>"
end
menu << "</ul>"
print menu

我的错误是

did not find expected key while parsing a block mapping at...

所以函数 delete 在这里不起作用,我的问题是,如何从这个数组中删除 "name" 元素?为什么 print "<li><a href=\"#{element['addr']}\">#{element['text']}</a></li>" 不起作用? 感谢您的帮助:-)

您的 YAML 无效,因为数组必须与键相关联。你可能想使用类似的东西:

menu:
  primary:
    name: General menu
    items:
      -
        text: Home
        addr: index.html
      -
        text: Contact
        addr: contact.html

此外,请摆脱 PHP 在变量前加上 $ 的做法。在 ruby 中,这使得变量成为全局变量,应尽可能避免使用它们。

以下说明了您想要的操作:

data = YAML.load <<YAML
menu:
  primary:
    name: General menu
    items:
      -
        text: Home
        addr: index.html
      -
        text: Contact
        addr: contact.html
YAML        

=> data 
{"menu"=>{"primary"=>{"name"=>"General menu", "items"=>[{"text"=>"Home", "addr"=>"index.html"}, {"text"=>"Contact", "addr"=>"contact.html"}]}}}
=> data['menu']['primary'].delete('name')
"General menu"
=> data
{"menu"=>{"primary"=>{"items"=>[{"text"=>"Home", "addr"=>"index.html"}, {"text"=>"Contact", "addr"=>"contact.html"}]}}}

您的 HTML 生成器也应该按如下方式工作:

menu = "<ul>"
data['menu']['primary']['items'].each do |element|
  menu << "<li><a href=\"#{element['addr']}\">#{element['text']}</a></li>"
end
menu << "</ul>"