1

有没有办法让这种情况在 Rails 视图中更加紧凑?

例如我有火腿

= object.count unless object.count ==0

我有点不喜欢我在那里重复这个功能,我宁愿有类似的东西

= object.count unless ==0

例如,如果我有更复杂的陈述

= object.relations.where(attribute: "something").count unless zero?

我可以把它分成两行说

- cnt = object.relations.where(attribute: "something").count
= cnt unless cnt==0

但是对于每种情况,我都会有多行,并且存储一个要使用一次的变量很糟糕。

编辑:只是为了详细说明我想检查数字是否为 0,如果是,则不显示任何内容。这样看起来更好看。

更新:

其中一个答案提出了沿着这些思路的解决方案

class Object
  def unless
    self unless yield(self)
  end
end

所以我可以用一个块来调用我拥有的任何对象,例如。.unless{|c| c<1}

这让我可以附加条件,并清楚地知道发生了什么:),奖励是因为它是块驱动的,我可以在任何对象上使用它:P。

谢谢大家 :)

更新更多

|c|块吸。所以我查了api也改了

class Object
  def unless(&block)
    self unless instance_eval(&block)
  end
end

所以现在我可以使用 .count.unless{zero?} 来完成这个:P。或者,如果我有一个复杂的情况,我可以将其添加到|c|etc中。

4

4 回答 4

3

如果 object 是一个数组,您可以使用object.empty?(或object.any?相反的情况)

于 2012-08-02T08:06:09.267 回答
3

只需创建一个视图助手:

def display_count_or_nothing(array)
  array.count unless array.count == 0
end

在视图中,您可以像这样使用它:

<%= display_count_or_nothing(array) %>
于 2012-08-02T09:10:41.230 回答
2

我认为以下内容很好很清楚,虽然我讨厌变量“对象”,但如果变量的名称描述了数组的内容(复数形式)会更好

= object.count unless object.empty?
于 2012-08-02T11:08:16.793 回答
1

如果这只是关于count,你可以猴子补丁Enumerable

module Enumerable
  def count_or_empty_string
    self.any? ? self.count : ''
  end
end

如果object是可枚举的,您可以这样做:

= object.count_or_empty_string

这将返回一个""ifobject.count == 0否则它将返回一个整数。因此不再需要unlessif在您的 HAML 中。

于 2012-08-02T08:31:31.173 回答