Rails3、Ruby 1.9.2、および最新の HAML gem にアップグレードしました。このコードは以前は機能していました:
= allowed? do
= link_to('New', new_video_path)
allowed?
が得られます0
。
私がすればそれは動作します:
= allowed?{ link_to('New', new_video_path) }
何を与える?
Rails3、Ruby 1.9.2、および最新の HAML gem にアップグレードしました。このコードは以前は機能していました:
= allowed? do
= link_to('New', new_video_path)
allowed?
が得られます0
。
私がすればそれは動作します:
= allowed?{ link_to('New', new_video_path) }
何を与える?
このyieldの概念を実行して、適切にキャプチャしたいコンテンツを許可する最もクリーンな方法は次のとおりです。
= allowed? do
- capture_haml do
= link_to('New', new_video_path)
しかし、あなたの場合、別のヘルパー メソッドを作成してみませんか?
def allowed_link_to(*args, &block)
opts = args.extract_options!
if allowed? args.last
link_to args.push(opts), &block
else
''
end
end
そして、次のように使用します。
= allowed_link_to('New', new_video_path)
そもそもなぜその出力をエコーしているのですか?あなたがしているべきです:
- allowed? do
= link_to('New', new_video_path)
=
一般に、ブロックで出力演算子()を使用することは決してありません。ブロックで出力されたものはブロックに戻されません。バッファに直接連結されます。このようなブロックを使用すると、コンテンツの順序が正しくないというエラーが発生する可能性があります。
これは私が見つけるのに少し時間がかかりました、しかしこれはあなたがそれをする方法です:
def wrap_in_div(&block)
"<div>#{capture_haml(&block)}</div>"
end
問題は、hamlがラックなどに送信する前に、すべてを独自の特別なバッファーに出力することです。したがって、最初にhamlにブロックを呼び出させ、それをバッファリングする必要があります。