我刚刚阅读了Rails'concat
方法来清理在http://thepugautomatic.com/2013/06/helpers/输出内容的帮助程序。
我玩弄了它,我发现它对带有花括号的块和带有do ... end的块没有同样的反应。
def output_something
concat content_tag :strong { "hello" } # works
concat content_tag :strong do "hello" end # doesn't work
concat(content_tag :strong do "hello" end) # works, but doesn't make much sense to use with multi line blocks
end
我不知道花括号和...结束块似乎有不同的含义。有没有办法使用concat
来做...结束没有括号括起来(第3个例子)?否则在某些情况下似乎没用,例如当我想在UL中连接许多LI元素时,我必须使用多行代码。
答案 0 :(得分:5)
归结为Ruby的范围。使用concat content_tag :strong do "hello" end
时,该块会传递到concat
,而不是content_tag
。
使用此代码玩具,你会看到:
def concat(x)
puts "concat #{x}"
puts "concat got block!" if block_given?
end
def content_tag(name)
puts "content_tag #{name}"
puts "content_tag got block!" if block_given?
"return value of content_tag"
end
concat content_tag :strong do end
concat content_tag :strong {}
引用:Henrik N来自“使用concat和capture来清理自定义Rails助手”(http://thepugautomatic.com/2013/06/helpers/)