我刚刚升级到 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) }
是什么赋予了?
执行此收益概念以允许正确捕获您想要的任何内容的最简洁方法是:
= 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)
我花了一段时间才找到,但这就是你的做法:
def wrap_in_div(&block)
"<div>#{capture_haml(&block)}</div>"
end
问题是 haml 在将所有内容发送到机架或任何地方之前将其输出到自己的特殊缓冲区。所以你必须让haml先调用块并缓冲它。
为什么你首先要回显它的输出?你应该这样做:
- allowed? do
= link_to('New', new_video_path)
通常,您永远不想将输出运算符 ( =
) 与块一起使用。块中输出的东西不会返回到块中;它直接连接到缓冲区中。使用这样的块可能会产生内容乱序的错误。