문제

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' |

더 좋은 게 있나요?

도움이 되었습니까?

해결책

이것은 버그가 아닌 기능입니다. Haml Multiline 블록은 의도적으로 다루기 힘들며, 차례가 어렵습니다. 거의 항상 루비 코드를 도우미에 넣는 것이 낫기 때문입니다. 도우미가 한 번만 호출 되더라도 템플릿을 훨씬 쉽게 읽을 수 있습니다. 예를 들어:

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' |

다른 팁

나는 여기에 언급된 것과 동일한 문제와 해결 방법에 직면했으며 여러 줄 블록과 관련된 HAML의 이상한(그리고 그렇습니다, 그것은 이상합니다) 동작으로 인해 나를 꽤 많이 괴롭혔습니다.나는 그것이 의도적이며 아마도 사용자가 자신의 코드를 더 쉽게 읽을 수 있도록 강요하려는 의도라는 것을 알고 있습니다.그러나 코드 구성과 관련하여 모든 개발자가 자신만의 선호도를 가지고 있다는 것은 잘 알려진 사실입니다.HAML은 그러한 제한을 적용하려고 시도하는 유일한 언어(c, c++, ruby, python, HTML 등)입니다.

버그가 아닌 기능을 처리하는 이상한 여러 줄을 호출하는 것은 언어 설계에 결함이 있음을 나타냅니다.결국 그것은 항상 사용자의 눈에는 버그일 것입니다.여러 줄 지원은 모든 주요 스트림 언어의 기본 기능이며 이 기능이 없다는 것은 M$ 클립과 마찬가지로 사용자를 안내하려는 시도라고 생각되는 단순한 귀찮은 일입니다.

즉, HAML은 HTML 작성에 매우 컴팩트하고 유용한 언어입니다.(경우에 따라) 여러 줄 블록을 선호하는 사람들은 "읽기 쉬운 코드"에 대한 언어 디자이너의 개인적인 정의에 관계없이 괜찮은 여러 줄 블록 지원을 활성화/비활성화할 수 있는 일종의 구성 옵션이 최소한 제공되기를 원할 것입니다. ".

거기에 도달할 때까지 "-#" 해킹을 사용하여 언어 문제를 해결해야 할 것 같습니다...

당신은 당신의 도우미에 블록을 사용할 수 있으며, 무엇이든 의미가있는 것을 산출 할 수 있습니다.

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'

그것은 해킹 (정렬)이지만, 두 번째, 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' |
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top