Меню навигации Rails из многомерного массива - PullRequest
0 голосов
/ 11 сентября 2018

Я веб-дизайнер, работающий в приложении rails / slim.Я не очень знаком с рельсами, хотя ...

Мне поручено создать меню навигации.Я вспоминаю использование Jekyll, генератора рубиновых статических сайтов.Я имел обыкновение хранить свои навигационные данные как yaml.Это включало метки элементов навигации и ссылки на пути.

Я хотел бы знать, могу ли я сделать то же самое в рельсах.Например, как я могу пройти через этот массив в моем вспомогательном контроллере приложения и распечатать навигацию в моем представлении?

$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 голосов
/ 12 сентября 2018

Это то, что я придумал. Он используется в синтаксисе 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)
0 голосов
/ 11 сентября 2018

не лучший способ, просто пишите, глядя на массив, который вы дали, и вы наверняка найдете лучший способ сделать это

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