質問

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

私が見つけた唯一の作業ソリューションは、間にルビーコードの空白行を実行することです。それは本当に醜く見えます。

= 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ブロックは、意図的に扱いにくい - 次へとフォローするのが難しいことを含めて、ほとんど常にその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

それからあなたのハムルで、ただしてください

= 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は、私が知っている唯一の言語(C、C ++、Ruby、Python、HTMLなど)であり、そのような制限を課そうとします。

バグではなく機能を扱う奇妙なマルチラインを呼び出すと、欠陥のある言語デザインを示します。最終的には、ユーザーの目には常にバグになります。マルチラインサポートは、メインストリーム言語の基本的な機能であり、この機能の欠如は単なるアノーイングです。M$ PaperClipのように、ユーザーをガイドする試みでもあると思います。

そうは言っても、ハムルは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

今あなたのハムルに:

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

ハック(並べ替え)ですが、チェーン内の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' |
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top