7

以下のコードは機能しています

-@items.each do |item|
 %tr
  %td
   =item.quantity
   times
  %td= item.product.title
 end

{ }ただし、の代わりに使用したいdo ... end。出来ますか?

-@items.each { |item|
 %tr
  %td
   =item.quantity
   times
  %td= item.product.title
 }

何らかの理由で例外がスローされます。私は何を間違えましたか?

4

2 に答える 2

14

作業例では、end行は生のテキストとして扱われ、出力に含まれます。endこれは、事実上キーワードがないために機能します。この行を次のように変更する- endと(つまり、ハイフンを追加する(そして、インデントが正しいことを確認する))、次のようなエラーが表示されます。

Syntax error on line 9: You don't need to use "- end" in Haml. Un-indent to close a block:
- if foo?
  %strong Foo!
- else
  Not foo.
%p This line is un-indented, so it isn't part of the "if" block

endHamlがキーワードを常に禁止しているわけではなくend、それ自体だけであることに注意してください。これらは、ステートメント修飾子とともに使用できます。例:

- @things.each do |thing|
  %p= thing.to_s
-end unless @dont_show_things

または、ブロックの結果を利用したい場合:

= @things.map do |thing|
  - do_something_with(thing)
-end.join(",")

使用に関しては{}、できません。HamlがテンプレートをRubyにコンパイルすると、必要に応じてブロックを閉じるためにハードコードされた文字列endが追加されます。を使用できるようにHamlを変更することは可能かもしれdo..endませ{}んが、余分な複雑さはおそらくそれだけの価値はありません。do...endこの方法は、複数行のブロックや{}単一行のブロックに使用する一般的なRubyのイディオムに適しています。

{}演算子の優先順位に関する問題のために使用する必要がある場合は、ヘルパーメソッドを作成するための兆候である可能性があります。Hamlテンプレート(または任意の言語のテンプレート)は、複雑なロジックに最適な場所ではありません。実際のRubyファイルに移動するのが最適です。

于 2012-08-10T21:45:13.280 に答える
5

endHAMLには何も入れないでください。インデントはセマンティックです。したがって、コードは次のようになります。

- @items.each do |item|
  %tr
    %td
      = item.quantity
      times
    %td= item.product.title

編集:を使用{すると、構文エラーがスローされます。

于 2012-08-07T08:49:49.217 に答える