Подтвердить что ты не робот

Несколько многострочных блоков HAML

Используя (намеренно) странный многострочный формат для HAML, я хотел бы иметь следующие строки в моем шаблоне:

= call_to_helper :foo1 => 'bar1', :foo2 => 'bar2', :foo3 => 'bar3', |
  :foo4 => 'bar4', :foo5 => 'bar5' |

-# and

= call_to_helper :foo1 => 'bar1', :foo2 => 'bar2', :foo3 => 'bar3', |
  :foo4 => 'bar4', :foo5 => 'bar5' |

Однако они не могут работать друг против друга или считаются одним многострочным блоком.

-# This fails:
= call_to_helper :foo1 => 'bar1', :foo2 => 'bar2', :foo3 => 'bar3', |
  :foo4 => 'bar4', :foo5 => 'bar5' |
= call_to_helper :foo1 => 'bar1', :foo2 => 'bar2', :foo3 => 'bar3', |
  :foo4 => 'bar4', :foo5 => 'bar5' |

И разделение с разрывом строки, что интересно, не лучше:

-# This fails, too:
= call_to_helper :foo1 => 'bar1', :foo2 => 'bar2', :foo3 => 'bar3', |
  :foo4 => 'bar4', :foo5 => 'bar5' |

= call_to_helper :foo1 => 'bar1', :foo2 => 'bar2', :foo3 => 'bar3', |
  :foo4 => 'bar4', :foo5 => 'bar5' |

Единственное работающее решение, которое я нашел, - запустить пустую строку кода Ruby между ними. Что выглядит очень уродливо.

= call_to_helper :foo1 => 'bar1', :foo2 => 'bar2', :foo3 => 'bar3', |
  :foo4 => 'bar4', :foo5 => 'bar5' |
-
= call_to_helper :foo1 => 'bar1', :foo2 => 'bar2', :foo3 => 'bar3', |
  :foo4 => 'bar4', :foo5 => 'bar5' |

Есть ли что-нибудь лучше?

4b9b3361

Ответ 1

Это функция, а не ошибка. Многострочные блоки Haml намеренно громоздки - в том числе трудно следовать один за другим - потому что почти все время лучше помещать этот код Ruby в помощника. Даже если помощник вызывается только один раз, он сделает ваш шаблон намного проще для чтения. Например:

def blatz_link
  call_to_helper :foo1 => 'bar1', :foo2 => 'bar2', :foo3 => 'bar3',
    :foo4 => 'bar4', :foo5 => 'bar5'
end

def blootz_link
  call_to_helper :foo1 => 'bar1', :foo2 => 'bar2', :foo3 => 'bar3',
    :foo4 => 'bar4', :foo5 => 'bar5'
end

Затем в вашем Haml просто сделайте

= blatz_link
= blootz_link

который будет намного читабельнее и понятнее.


Если вы абсолютно должны следовать одному многострочному блоку с другим, просто добавьте комментарий между ними:

= call_to_helper :foo1 => 'bar1', :foo2 => 'bar2', :foo3 => 'bar3', |
  :foo4 => 'bar4', :foo5 => 'bar5' |
-#
= call_to_helper :foo1 => 'bar1', :foo2 => 'bar2', :foo3 => 'bar3', |
  :foo4 => 'bar4', :foo5 => 'bar5' |

Ответ 2

Я столкнулся с теми же проблемами и обходными решениями, которые были упомянуты здесь, и странное (и да, это странно) поведение HAML в отношении многострочных блоков укусило меня довольно много раз. Я знаю, что он преднамерен и что он, вероятно, предназначен для того, чтобы заставить пользователя сделать его код более легким для чтения. Однако хорошо известно, что у каждого разработчика есть свои предпочтения, когда дело доходит до структурирования кода. HAML - единственный язык, который я знаю (c, С++, ruby, python, HTML и т.д.), Который пытается навязать такие ограничения.

Вызов сложной многострочной обработки функции, а не ошибки, просто указывает на ошибочный дизайн языка. В конце концов, это всегда будет ошибкой в ​​глазах пользователя. Многострочная поддержка является основной особенностью любого основного потока, и отсутствие этой функции просто аннотируется - точно так же, как справка M $, которая, как я считаю, также является попыткой помочь пользователю.

Говоря, HAML - это фантастически компактный и полезный язык для написания HTML. Те из нас, кто (в некоторых случаях) предпочитают многострочные блоки, просто любят, по крайней мере, предлагать какой-то вариант конфигурации для включения/отключения приличной многострочной поддержки блока - независимо от лингвистического определения языка "легко читаемый код" ".

Пока мы не доберемся туда, я думаю, нам придется работать с языком, используя "- #" взломать...

Ответ 3

Вы можете использовать блок для своего помощника, принося все, что имеет смысл.

module SomeHelper
  def call_to_helper
    foo = Foo.new
    yield foo
    # build your html here, using the foo object attributes
  end

  class Foo
    attr_accessor :foo1, :foo2, :foo3, :foo4, :foo5
  end

end

Теперь на вашем haml:

= call_to_helper do |foo|
  -foo.foo1 = 'bar1'
  -foo.foo2 = 'bar2'
  -foo.foo3 = 'bar3'
  -foo.foo4 = 'bar4'
  -foo.foo5 = 'bar5'

= call_to_helper do |foo|
  -foo.foo1 = 'bar1'
  -foo.foo2 = 'bar2'
  -foo.foo3 = 'bar3'
  -foo.foo4 = 'bar4'
  -foo.foo5 = 'bar5'

Ответ 4

Это взлом (сортировка), но вы всегда можете использовать "+" вместо "=" на своих 2-й, 3-й и т.д. в цепочке.

= call_to_helper :foo1 => 'bar1', :foo2 => 'bar2', :foo3 => 'bar3', |
  :foo4 => 'bar4', :foo5 => 'bar5' |
+ call_to_helper :foo1 => 'bar1', :foo2 => 'bar2', :foo3 => 'bar3', |
  :foo4 => 'bar4', :foo5 => 'bar5' |