Rails遍历数组和哈希

时间:2018-11-02 14:44:33

标签: ruby-on-rails ruby loops iteration

我正在尝试迭代我认为是Rails的哈希值。我使用deep_pluck gem来获取Model的值,其中包括来自关联的一些值。像这样:

    Continent.deep_pluck(:link_name, :name, 'countries' => [:link_name, :name])

这将返回:

   [{"link_name"=>"europe", "name"=>"europe", "countries"=>[{"link_name"=>"countryname", "name"=>"countryname"}]}]

我正在尝试这样迭代:

             <% results.each do |continent| %>
              <% continent.each do |link_name, name, countries| %>
                <%= link_name %>
              <% end %>

            <% end %>

这将返回:

                link_name
                name
                countries

我尝试了许多不同的方法和方法,但仍然无法获得所需的输出,即打印出:link_name和:name的值,以及另一个国家(地区)的对象再次对其进行迭代以获取其名称等。

我正在尝试构建一个导航菜单,其中包含每个大陆的列表以及该大陆的国家/地区的子菜单。我使用pluck是因为我只想要数据库的名称和link_names。

非常感谢您!

3 个答案:

答案 0 :(得分:2)

遍历哈希时,您可以访问键和值。

如果您查看打印出来的内容,那么您将获取每个哈希的键。如果将参数设置为实际值,则输出可能更有意义。

<% results.each do |continent| %>
  <% continent.each do |key, value| %>
    <%= key %>
  <% end %>
<% end %>

这应该足以使您走得更远。要实现所需的功能,您需要检查每个key并根据密钥是什么对value进行操作。

答案 1 :(得分:1)

也许尝试如下操作:

[{"link_name"=>"europe", "name"=>"europe", "countries"=>[{"link_name"=>"countryname", "name"=>"countryname"}]}].each do |continent|
  continent.each do |k,v|
    case k
    when 'countries'
      v.each do |country|
        country.each do |k,v| 
          puts "  - #{v}"
        end
      end
    else
      puts v
    end
  end
end

(自然,您需要添加erb标记。“ puts”仅是在控制台中运行的示例。)

哪个会给你:

europe
europe
  - countryname
  - countryname

答案 2 :(得分:0)

非常感谢您的建议,我终于设法使它像这样工作:

      <% results.each do |continent| %>
             <li class="has_children"><a href="/continents/<%= continent["link_name"] %>"><%= continent["name"] %></a>
              <ul class="sub_menu">
                <% continent["countries"].each do |country| %>
            <li><a href="/countries/<%= country["link_name"] %>"><%= country["name"] %></a>
                <% end %>


              </ul>

             </li>

            <% end %>