【问题标题】:Rails/Ruby one-liner unless zero/nil?除非零/零,否则 Rails/Ruby 单线?
【发布时间】:2012-07-31 04:18:55
【问题描述】:

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

例如我有haml

= 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| 等中。

【问题讨论】:

  • 无论如何都不应该在视图中做这种事情:object.relations.where(attribute: "something").count。对于简单的东西,我认为重复 object.count 没有问题。 unless == 0unless zero? 是不可能的。你总是需要对object做点什么。

标签: ruby-on-rails ruby conditional


【解决方案1】:

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

【讨论】:

  • 对不起,我不够清楚。 count 来自 activerecord 并且将始终返回一个值。如果它为零,我基本上想隐藏该值。一个空字段看起来比在表格中显示 0 更好。
  • 你仍然可以写成 = object.count if object.any?
  • 关键是它的丑陋和重复。我可以轻松完成类似的事情。
  • 关键是它的丑陋和重复。我可以轻松完成类似的事情。 = object.relations.where(attribute: "something").count unless object.relations.where(attribute: "something").count==0 但这很长,正如问题中所写,我可以将其分为两行,但是如果我有 6 个奇怪的位置来收集计数,这仍然令人不满意,6 个变量会很快变得丑陋。
  • @user1570690 - 您可以通过猴子修补 Enumerable 来删除重复。请参阅下面的答案。
【解决方案2】:

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

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

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

= object.count_or_empty_string

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

【讨论】:

  • 这与我所追求的非常接近。你让我想出一个通用版本,我可以将一个块传递给:)。我会把它发布到我的答案中:)
【解决方案3】:

只需创建一个视图助手:

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

在视图中你可以这样使用它:

<%= display_count_or_nothing(array) %>

【讨论】:

    【解决方案4】:

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

    = object.count unless object.empty?
    

    【讨论】:

    • 我不认为他的变量名真的是object...这段代码只是一个例子来说明他的问题。
    • 正确。对象是这样您就不会被对象的实际名称或其用途冲昏了头脑
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-21
    • 1970-01-01
    • 2015-07-11
    • 1970-01-01
    • 1970-01-01
    • 2017-03-20
    • 1970-01-01
    相关资源
    最近更新 更多