5

我刚刚阅读了有关 Railsconcat清理帮助器的方法,这些帮助器在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

我不知道花括号和 do...end 块似乎有不同的含义。有没有办法使用concatdo...end而不用括号括起来(第三个例子)?否则在某些情况下它似乎毫无用处,例如当我想连接一个包含许多 LI 元素的 UL 时,所以我必须使用多行代码。

4

1 回答 1

6

它归结为 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 {}

引用:来自“使用 concat 和捕获清理自定义 Rails 助手”的 Henrik N ( http://thepugautomatic.com/2013/06/helpers/ )

于 2013-10-17T08:46:52.347 回答