Разделение записей в Rails для отображения в меню - PullRequest
0 голосов
/ 18 января 2019

Я пытаюсь разделить мои записи пополам для отображения в моем меню. Меню состоит из двух столбцов (col-md-4), но методы, которые я использую с ODD количеством записей, помещают большее число с обратной стороны (last_half) моего меню. Чего мне не хватает?

Меню

<div class="col-md-4">
  <ul>
    <li class="mega-menu-title">Products</li>
    <% first_half(@menu_products).each do |product| %>
      <li>
        <%= link_to product_path(product) do %>
          <span class="text-yellow"><%= product.name %></span> <%= product.subtitle %>
        <% end %>
      </li>
    <% end %>
  </ul>
</div>
<div class="col-md-4">
  <ul>
    <li class="mega-menu-title">&nbsp;</li>
    <% last_half(@menu_products).each do |product| %>
      <li>
        <%= link_to product_path(product) do %>
          <span class="text-yellow"><%= product.name %></span> <%= product.subtitle %>
        <% end %>
      </li>
    <% end %>
  </ul>
</div>
<div class="col-md-4">
  <!--- non-related code in last column in menu --->
</div>

Помощник по применению

def first_half(list)
  list[0...(list.length / 2)]
end

def last_half(list)
  list[(list.length / 2)...list.length]
end

Ответы [ 2 ]

0 голосов
/ 19 января 2019

Это то, что я сделал, чтобы заставить его работать. Мне пришлось изменить длину на число с плавающей точкой to_f, затем я смог заставить его правильно тестировать в консоли.

def first_half(list)
  list[0...(list.length.to_f / 2).ceil]
end

def last_half(list)
  list[(list.length.to_f / 2).ceil...list.length]
end

Использование .ceil в обоих методах позволило математике работать.

0 голосов
/ 18 января 2019

Вы можете использовать следующее:

list.first((list.length/2).ceil) # will convert 1.5 to 2

И

list.last((list.length/2).floor) # will convert 1.5 to 1

Проблема, с которой вы столкнулись, состоит в том, что [7,8,9][3/2] возвращает 8, а логика 3/2 (list.size / 2) использовался в first_half и last_half.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...