2009-09-24 5 views
16

, 내 템플릿에 다음과 같은 라인을 가지고 싶습니다 서로 또는 하나의 단일 멀티 라인 블록으로 읽혀집니다.여러 멀티 라인 HAML 블록 HAML의 (의도적으로) 이상한 멀티 라인 형식을 사용

-# 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' | 
내가 찾은

유일한 작업 솔루션 사이의 루비 코드의 빈 줄을 실행하는 것입니다. 정말 못 생겼어.

= 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 코드를 도우미에 넣는 것이 낫다. 도우미가 한 번만 호출되는 경우에도 템플릿을 훨씬 쉽게 읽을 수 있습니다. 예를 들어 : 당신의 HAML에서 다음

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 

, 단지 훨씬 더 읽기 쉽고 이해하기 쉬울 것입니다

= 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

해킹 (정렬)이지만 체인의 두 번째, 세 번째 등 라인에서 항상 "="대신 "+"를 사용할 수 있습니다.

= 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

블록을 도우미로 사용하여 의미있는 결과를 얻을 수 있습니다. 당신의 HAML에 이제

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 

:

= 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 등) 유일한 언어입니다.

버그가 아닌 기능을 처리하는 별난 멀티 라인을 호출하면 결함있는 언어 디자인을 나타낼뿐입니다. 결국 그것은 사용자의 눈에는 항상 버그가 될 것입니다. 다중 회선 지원은 모든 주요 스트림 언어의 기본 기능이며이 기능의 부족은 M $ 클립과 마찬가지로 사용자를 안내하기위한 것일뿐입니다.

즉, HAML은 HTML을 작성하기위한 환상적으로 작고 유용한 언어입니다.우리 중 누가 멀티 라인 블록을 선호 하느냐는 언어 설계자의 "읽기 쉬운 코드"에 관계없이 괜찮은 멀티 라인 블록 지원을 가능/불가능하게하는 일종의 구성 옵션을 적어도 제공하는 것을 좋아할 것입니다. ". 우리가 거기까지

은, 우리가 사용하는 언어를 해결해야합니다 추측 "- #"해킹 ...

+0

누군가가 이것에 대한 갈래의 햄이 있는지 궁금해 .. –

관련 문제