在 Ruby on Rails 中测试一个单词是单数还是复数

Posted

技术标签:

【中文标题】在 Ruby on Rails 中测试一个单词是单数还是复数【英文标题】:Test if a word is singular or plural in Ruby on Rails 【发布时间】:2010-12-20 13:51:08 【问题描述】:

快速提问。

如何测试一个单词以查看它是单数还是复数?

我真的很喜欢:

test_singularity('word') # => true
test_singularity('words') # => false

我敢打赌 rails 是有能力的!

谢谢。

【问题讨论】:

【参考方案1】:

在 Rails 中,您可以进行 string#singularize|#pluralize 比较以返回真或假值。

但我认为由于语言本身的性质,这可能需要一些备份才能完全准确。

你可以这样做

def test_singularity(str)
  str.pluralize != str && str.singularize == str
end

但是为了看看准确度,我跑了一组快速的单词。

%w(word words rail rails dress dresses).each do |v|
  puts "#v : #test_singularity(v)"
end

word : true
words : false
rail : true
rails : false
dress : false
dresses : false

实际上我有点惊讶,因为 'dress' 确实可以正确地复数,但是当它通过 #singularize 时会遇到一些障碍。

'dress'.pluralize # => dresses
'dress'.singularize # => dres

【讨论】:

这里解决了“dress”.singularize 问题:rails.lighthouseapp.com/projects/8994/tickets/…【参考方案2】:

大多数时候我从不测试单数或复数,我只是将其转换为我需要的单数或复数形式。

Rails 2.3.x 中这是可能的,写这样的东西

plural_form = org_word.singularize.pluralize
singular_form = org_word.pluralize.singularize

进一步研究,一个工作函数很容易提供:

require 'active_support'

def is_singular?(str)
  str.pluralize.singularize == str
end


%w(word words rail rails dress dresses).each do |v|
  puts "#v : #is_singular?(v)"
end

给出以下输出:

word : true
words : false
rail : true
rails : false
dress : true
dresses : false

Rails 4 中,使用给定的单词,现在要容易得多。你可以这样做

plural_form = org_word.pluralize
singular_form = org_word.singularize

因此该功能也变得更加容易:

require 'active_support'

def is_singular?(str)
  str.singularize == str
end

【讨论】:

这里解决了“dress”.singularize 问题:rails.lighthouseapp.com/projects/8994/tickets/… 变形器确保可以为困难的情况定义复数或单数。例如:对于阀门,它是必要的。但是大多数时候您只想对模型进行单数化和复数化?所以这些情况已经得到纠正(或者你的路线会被搞砸)。但我的例行程序确实为礼服/礼服返回了正确的答案。 为什么要先转换成复数形式? 当时,对我来说,这是获得正确表格的故障安全方式。我还没有在当前的轨道上尝试过这个。你看到这个答案有多老了吗? :) 我在 rails 4 中尝试过并相应地更新了我的答案。你是对的@Simon,它不再需要了。【参考方案3】:

ruby 和 rails 都没有提供用于测试单词“复数”的特定方法。

正如 nowk 所说,与word.pluralizeword.singularize 相比,您最多只能自己实现它们。这将为您提供一种快速、廉价且普遍良好的测试方式。不过,它有时会失败。

如果你需要更精确,你需要使用Ruby Linguistics gem,它可以正确处理礼服和礼服(但它更重)。

【讨论】:

实际上,singularize 的东西默认不包含在 rails 上,但可以通过变形器解决。在其他帖子上查看我的 cmets。

以上是关于在 Ruby on Rails 中测试一个单词是单数还是复数的主要内容,如果未能解决你的问题,请参考以下文章

Ruby on Rails 单元测试

在 Ruby on Rails 中测试模型实例是不是为“空”的最佳方法是啥?

使用 Ruby on Rails 的 angular.js 中的安全性

Ruby on Rails 3 发布日期 [关闭]

使用 RESTful 身份验证插件进行 Ruby on Rails 功能测试

Circle CI 上的 Rspec 测试失败(Ruby on Rails 5.2.3)