Ruby中是否有复数形式函数,而不是Rails?

62

我正在编写一些 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

1
编辑不正确。没有 ruby 函数 String#pluralize,您可能缺少 require 'active_support/inflector' 或其他东西。 - gorn
Rails一直在不断变化。请随意编辑我的问题,以使其正确无误。我目前没有使用Rails,因此没有时间测试并确定现在正确的操作方式。 - aarona
7个回答

82

实际上你需要做的只有

require 'active_support/inflector'

这将扩展字符串类型。

然后,您可以执行以下操作:

"MyString".pluralize

这将返回

"MyStrings"

对于2.3.5版本,请尝试以下方法:

require 'rubygems'
require 'active_support/inflector'

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

sudo gem install activesupport

然后就需要这些模块了。


针对2.3.5版本,请执行以下命令安装activesupport:sudo gem install activesupport然后,在你的代码中添加以下两行:require 'rubygems' require 'active_support/inflector'这样应该就可以了。我正在使用最新版的Rails(3),它已经进行了很多解耦,似乎默认捆绑了一些内容。 - scaney
这是ActiveView的复数核心,但ActiveView#pluralize还知道何时应该使用复数或单数版本,基于第一个参数。 - the Tin Man

58

对于大多数情况来说,使用Inflector过于复杂。

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 

这是一个非常棒的解决方案。简单而且真正你所需要的一切。 - Chris Knadler
这完美地完成了工作,确实是一个很棒的解决方案。 - Benny

15

我个人喜欢 linguistics gem,它与rails无关。

# from it's frontpage
require 'linguistics'

Linguistics.use :en

"box".en.plural #=> "boxes"
"mouse".en.plural #=> "mice"
# etc

3
这个对我有用(使用 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"

1
require 'active_support'
require 'active_support/inflector'

inf = ActiveSupport::Inflector::Inflections.new

获取 inflector,不确定如何使用它


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'。

希望有所帮助。


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"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接