【问题标题】:Rails Navigation Menu From Multidimensional Array来自多维数组的 Rails 导航菜单
【发布时间】:2018-09-11 03:56:02
【问题描述】:

我是一名网页设计师,从事 rails/slim 应用程序。不过我对 Rails 不是很熟悉...

我的任务是构建一个导航菜单。我记得使用 Jekyll,一个 ruby​​ 静态站点生成器。我曾经将导航数据存储为 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"]
  ]
]

注意:“Page A”和“Page C”只是导航父项,不是实际链接。

【问题讨论】:

    标签: ruby-on-rails multidimensional-array


    【解决方案1】:

    不是最好的方法,只是通过查看你给出的数组来写,你肯定会找到更好的方法来做到这一点

    <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>
    

    【讨论】:

      【解决方案2】:

      这就是我想出的。如果您不熟悉它,它采用 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)
      

      【讨论】:

        猜你喜欢
        • 2012-07-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-26
        • 1970-01-01
        • 2021-08-19
        相关资源
        最近更新 更多