Используя HAML (в Ruby on Rails), есть ли способ сгенерировать 50 вложенных разделов?

#ruby-on-rails #haml

#ruby-on-rails #haml

Вопрос:

Чтобы протестировать что-либо на наличие границ CSS во вложенных разделах, необходимо сгенерировать 50 разделов. Другими словами, сгенерировать

 <div>
  <div>
    <div>
      ...  total 50 of them nested
    </div>
  </div>
</div>
  

потому что

 - 50.times do
  %div 
  

не подойдет, так как все они будут параллельными, а не вложенными.

Комментарии:

1. используйте рекурсию в помощнике с content_tag

Ответ №1:

Упрощенно, но, похоже, работает.

 - 50.times do
  <div>
- 50.times do
  </div>
  

v2 — Все еще упрощенный, но предоставляет больше возможностей.

 - 50.times do |i|
  != "<div style='border-style:#{cycle('dotted','dashed')}'>".rjust(i 35)
  = i
- 50.downto(1) do |i|
  != "</div>".rjust(i 35) 
  

Комментарии:

1. Дональд, я потратил 30 минут (в качестве упражнения), пытаясь выяснить, как сделать отступ <div> в HAML, и только что сдался, когда увидел вашу версию «v2». Я даже не знал о != разметке до этого вечера. Спасибо за урок! P.S. изменение последней строки на != "</div>".rjust(i 7) делает ее идеальной.

2. @Dave, я тоже делал это для the challenge и тоже не знал о != … почти сдался, пока не нашел этот чит-лист . Это было весело!

3. хороший ответ. Я не знал, что вы можете поместить разметку непосредственно как «содержимое»… это интересно

Ответ №2:

Вы можете попробовать это:

 module ApplicationHelper

  def recursive_divs(number)
    if number > 0
      number -= 1
      content_tag :div do
        recursive_divs(number)
      end
    end
  end

end
  

И использовать его в своем представлении:

 = recursive_divs(50)
  

надеюсь, это поможет

Ответ №3:

Вы близки. Все, что вам нужно сделать, это добавить 2 пробела для каждой итерации цикла.

 - 50.times do |i|
  ="#{' ' * (i*2)}"%div
  

' ' * (i*2) Часть использует тот факт, что строки можно умножать.

Комментарии:

1. Спасибо… Знал, что это возможно, но не мог вспомнить, как умножать строки. Поскольку интервал был вторичным по отношению к вложенности, я не тратил много времени на изучение этого. Спасибо за ваш ответ.

2. @DonaldSowell да, главное помнить, что строка должна быть ПЕРВОЙ, поскольку это вызов метода для string. Если вы поставите первым число, а вторым строку, это не сработает. Но также, поскольку это HAML, пробел ЯВЛЯЕТСЯ вложенностью.

3. вы уверены, что ="#{' ' * (i*2)}"%div работает? Я попробовал это, и это не сработало. Это выдаст ошибку как undefined local variable or method 'div' for #<#<Class:0x00000104842e48>:0x000001048410e8>

4. извините, я просто тестировал использование irb, чтобы посмотреть, выведет ли он правильное число пробелов. Я не учел тот факт, что его необходимо вывести в haml ПЕРЕД визуализацией.