Rails的concat方法和带有do ... end的块不起作用

时间:2013-10-11 13:40:53

标签: ruby-on-rails block concat

我刚刚阅读了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元素时,我必须使用多行代码。

1 个答案:

答案 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/