Несколько многострочных блоков 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' |
Есть ли что-нибудь лучше?
Ответы
Ответ 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' |