59

我正在编写一些 Ruby 代码,而不是 Rails,我需要处理这样的事情:

found 1 match
found 2 matches

我已经安装了 Rails,所以也许我可以require在脚本顶部添加一个子句,但是有人知道 RUBY 方法可以将字符串复数吗?如果脚本不是 Rails 但我安装了 Rails,是否有我可以要求的类来处理这个问题?

编辑:所有这些答案都很接近,但我检查了一个让它为我工作的答案。在编写 Ruby 而不是 Rails 代码时,请尝试将此方法作为助手:

def pluralize(number, text)
  return text.pluralize if number != 1
  text
end
4

7 回答 7

79

其实你需要做的就是

require 'active_support/inflector'

这将扩展 String 类型。

然后你可以做

"MyString".pluralize

这将返回

"MyStrings"

对于 2.3.5 尝试:

require 'rubygems'
require 'active_support/inflector'

应该得到它,如果没有尝试

sudo gem install activesupport

然后是要求。

于 2010-03-16T10:29:58.280 回答
57

在大多数情况下,变形器是矫枉过正的。

def x(n, singular, plural=nil)
    if n == 1
        "1 #{singular}"
    elsif plural
        "#{n} #{plural}"
    else
        "#{n} #{singular}s"
    end
end

把它放在 common.rb 中,或者任何你喜欢你的通用实用程序函数的地方......

require "common" 

puts x(0, 'result') # 0 results
puts x(1, 'result') # 1 result
puts x(2, 'result') # 2 results

puts x(0, 'match', 'matches') # 0 matches
puts x(1, 'match', 'matches') # 1 match 
puts x(2, 'match', 'matches') # 2 matches 
于 2010-06-13T03:36:18.837 回答
15

我个人喜欢绝对与 Rails 无关的语言学瑰宝。

# from it's frontpage
require 'linguistics'

Linguistics.use :en

"box".en.plural #=> "boxes"
"mouse".en.plural #=> "mice"
# etc
于 2011-05-02T16:14:08.887 回答
2

这对我有用(使用 ruby​​ 2.1.1 和 actionpack 3.2.17):

~$ irb
>> require 'action_view'
=> true
>> include ActionView::Helpers::TextHelper
=> Object
>> pluralize(1, 'cat')
=> "1 cat"
>> pluralize(2, 'cat')
=> "2 cats"
于 2015-01-06T20:06:11.507 回答
1
require 'active_support'
require 'active_support/inflector'

inf = ActiveSupport::Inflector::Inflections.new

得到变形器,不知道你是如何使用它的

于 2010-03-15T10:35:58.890 回答
1

我的解决方案:

# Custom pluralize - will return text without the number as the default pluralize.
def cpluralize(number, text)
  return text.pluralize if number != 1 
  return text.singularize if number == 1
end

因此,如果您调用 cpluralize(1, 'reviews'),您可以返回 'review'

希望有帮助。

于 2011-12-14T13:28:47.807 回答
0

我为此定义了一个辅助函数,我将它用于每个用户可编辑模型的索引视图:

  def ovyka_counter(array, name=nil, plural=nil)
    name ||= array.first.class.human_name.downcase
    pluralize(array.count, name, plural)
  end

然后你可以从视图中调用它:

<% ovyka_counter @posts %>

对于国际化 (i18n),您可以将其添加到您的语言环境 YAML 文件中:

  activerecord:
    models:
      post: "Conversation"
于 2011-02-15T17:45:24.340 回答