这个Ruby case语句的语法错误是什么?

时间:2011-12-13 14:04:59

标签: ruby-on-rails ruby case

出于某种原因,when @orgs无效:

  @orgs = Organization.all.select{|a|a.active}.count
  case collection.size
  when 0; "No #{entry_name.pluralize} found"
  when @orgs; "#{@orgs} Businesses Returned!"
  else; "#{collection.total_entries} of #{@orgs} Businesses Returned!"
  end

这在语法上是否准确?它将始终返回最后一个else语句。即使@orgs == @orgs。

,它也永远不会出现在第二个if语句中

@orgs = 1211的实际数量。

因此,如果我使用when语句when 1211;,它仍然无法捕获。这里有语法错误吗?

2 个答案:

答案 0 :(得分:3)

您是否尝试过以下语法?

case collection.size
  when 0 then "No #{entry_name.pluralize} found"
  when @orgs then "#{@orgs} Businesses Returned!"
  else "#{collection.total_entries} of #{@orgs} Businesses Returned!"
  end

答案 1 :(得分:2)

您的语法不是问题。我认为,你的条件中的逻辑都搞砸了。

所以,@ orgs 不是= 1211 ,@ orgs是一个大小为1211的集合。差别很大。

  • 此案例陈述将始终失败,因为案例为collection.size,大概应为@orgs.size

假设我们将其更改为:

case @orgs.size
  ...

然后:

  • 您的第一个when语句将在@orgs.size == 0
  • 时开始工作
  • 您的第二个when语句仍会失败,因为@orgs.size != @orgs - 它永远不会。 @orgs指的是对象集合,而@orgs.size指的是该集合的大小。即使@orgs == nil它仍然会失败,因为@orgs.size会抛出错误,因为您在size对象上调用nil方法,这是不允许的。
  • 由于上面列出的问题,您的else语句始终被调用的语句,并且因为您编写它的方式可以防止任何其他情况出现。< / LI>

然而,这可能还不够。它看起来像你试图返回单数或复数文本取决于你有多少。这是您可能要编写的代码,没有使用分号:

@active_orgs = Organization.all.select{|a| a.active}
@singular_name = Organization.class.name
@plural_name = @singular_form.pluralize

case @active_orgs.size
when 1
  "1 active #{@singular_name} of a total #{Organization.count} #{@plural_name}!"
else
  "#{@active_orgs.count} active #{@singular_name} of a total #{Organization.count} #{@plural_name}!"
end

即使计数为0,这也会复数,因此会说0 active Organizations of a total 125 Organizations!

...或当值为1时,它会显示1 active Organization of a total 125 Organziations!

如果您不希望Organization大写,则可以添加对.downcase的调用来处理此问题。