2009-09-24 4 views
16

Используя (намеренно) странный формат многострочных для 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' | 

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

+5

** Обновление: ** Трубы не требуется в последней версии Haml , так что не зацикливайтесь на этом, если вы сейчас спотыкаетесь по этому вопросу;) – Matchu

ответ

22

Это особенность, а не ошибка. 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' | 
+0

Сначала я сопротивлялся, но в итоге он просто стал таким громоздким со всеми связями (особенно в области персонала, где появилось раскрывающееся меню «Больше» для управления тоннами других моделей), что я просто сдал и перестроил код быть управляемым. Спасибо :) – Matchu

2

Это хак (вид), но вы всегда можете использовать «+» вместо «=» на своих 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' | 
+0

Ха-ха, умный. Это определенно лучше, чем какой-то случайный тире, застрявший посередине: P – Matchu

+0

Это не приятно, потому что это означало бы, что это хорошо. Это просто меньше. Вот почему я использую nodejs для всех проектов, где я могу сказать. – Funkodebat

+0

В моем случае проблемные блоки не были '=', а '%', поэтому это не работает для меня. – Nakilon

3

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

module SomeHelper 
    def call_to_helper 
    foo = Foo.new 
    yield foo 
    # build your html here, using the foo object's 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' 
8

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

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

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

Пока мы не получим там, я думаю, мы должны будем работать вокруг языка, используя «- #» хак ...

+0

Интересно, если кто-то разветвил haml для этого .. –

Смежные вопросы