来自多维数组的Rails导航菜单

时间:2018-09-11 03:56:02

标签: ruby-on-rails multidimensional-array

我是一名从事Rails / Slim应用程序的网页设计师。我对Rails并不是很熟悉...

我的任务是建立导航菜单。我记得使用Jekyll(一个红宝石静态站点生成器)。我曾经将导航数据存储为yaml。这包括导航项标签和以及指向路径的链接。

我想知道我是否可以在rails中做同样的事情。例如,如何在应用程序助手控制器中遍历此数组并在视图中打印出导航?

$navPages = [
  ["Home", "root_path"],
  ["Page A",
    ["Sub Page 1", "page_a_1_index_path"],
    ["Sub Page 2", "page_a_2_index_path"],
  ],
  ["Page B", "page_b_index_path"],
  ["Page C",
    ["Sub Page 1", "page_c_1_index_path"],
    ["Sub Page 2", "page_c_2_index_path"],
    ["Sub Page 3", "page_c_3_index_path"]
  ]
]

注意:“页面A”和“页面C”仅是导航父项,而不是实际链接。

2 个答案:

答案 0 :(得分:0)

不是最好的方法,只是查看给定的数组即可,您肯定会找到一种更好的方法

<nav>
  <% navPages.each do |menu| %>
  <ul>
    <% flatten_menu = menu.flatten.drop(1) %>
    <% if flatten_menu.one? %>
      <li><%= link_to "#{menu[0]}", menu[1] %></li>
    <% else %>
    <li>
      <%= menu[0] %>
      <ul>
        <% flatten_menu.each_slice(2) do |sub| %>
          <li><%= link_to "#{sub[0]}", sub[1] %></li>
        <% end %>
      </ul>
    </li>
    <% end %>
  </ul>
  <% end %>
</nav>

答案 1 :(得分:0)

这是我想出的。如果您不熟悉它,它采用Slim语法。

首先,我更改了导航数据的形状:

$navPages = [
  [ 
    "Page A", 
    "page_a_index_path", 
    "" 
  ],
  [ 
    "Page B", 
    "",
    [
      [ "Sub Page 1", "sub_page_a_1_index_path"],
      [ "Sub Page 2", "sub_page_a_2_index_path"],
    ]
  ],
  [ "Page C", "page_c_index_path", "" ],
  [ 
    "Page D", 
    "",
      [
      [ "Sub Page 1", "sub_page_d_1_index_path"],
      [ "Sub Page 2", "sub_page_d_2_index_path"],
    ]
  ],
 ]

然后我遍历它:

ul.menu
  - $navPages.each do |label, path, items|
    - if path != ""
      li
        = link_to label, self.send(path.to_sym)
    - else
      li.has-children
        = link_to label, "#"
        - if items != ""
          ul
            - items.each do |nlabel, npath|
              li
                = link_to nlabel, self.send(npath.to_sym)