为什么不做/ end和{}总是等价?

时间:2011-09-20 15:24:14

标签: ruby-on-rails ruby

  

可能重复:
  Ruby block and unparenthesized arguments
  What is the difference or value of these block coding styles in Ruby?

我一直认为以下只是两种说法相同的方式:

[1,2,3].collect{|i| i * 2}

[1,2,3].collect do |i|
  i * 2
end

但是我在我的一个ERB模板中得到了一些奇怪的行为,其中两个语法似乎做了两件不同的事情。这段代码效果很好:

<%=raw @menu.collect { |m| 
    content_tag("li") {
        link_to(m.capitalize, url_for(:controller => m))
    } 
} %>

但是当我把它改写为:

<%=raw @menu.collect do |m| 
    content_tag("li") do
        link_to(m.capitalize, url_for(:controller => m))
    end 
end %>

...我最终得到了一系列@menu项目的串联字符串。我错过了什么吗?是否有一些细小的语法糖妨碍了这里?

1 个答案:

答案 0 :(得分:0)

我会使用您的第一种方法或将此代码放在视图助手中。但如果我确实想要使用块,我可能会做这样的事情。

<% @menu.collect do |m| %>
   <%= content_tag("li") do %>
        <% link_to(m.capitalize, url_for(:controller => m)) %>
   <% end %>
<% end %>