Ruby on Rails是多元化的

时间:2009-11-06 08:35:35

标签: ruby-on-rails

是否有帮助避免这种代码?

= @leads.length == 1 ? 'is' : 'are'

我知道复数,但在这种情况下没有帮助。我知道编写一个帮助程序是微不足道的,我想知道Rails API中是否存在我忽略的内容。

谢谢,

-Tim

4 个答案:

答案 0 :(得分:18)

正如t6d所说,你需要在Rails变换器中添加is / are。只是来自td6的代码,但您需要添加ActiveSupport命名空间:

ActiveSupport::Inflector.inflections do |inflection|
  inflection.irregular "is", "are"
end

现在内置的帮助程序Rails是复数形式,但在视图中不会执行您想要的操作。 例如:

pluralize(@leads.length,'is')

输出(2个潜在客户)

2 are

对于你想要的东西,你需要制作你自己的帮助器,它会使单词多元化,但不输出计数。所以如果你把它基于当前的轨道复数:

def pluralize_no_count(count, singular, plural = nil)
  ((count == 1 || count == '1') ? singular : (plural || singular.pluralize))
end

答案 1 :(得分:2)

也许你可以使用复数并为'is'添加一个变形

Inflector.inflections do |inflection|
  inflection.irregular "is", "are"
end

这样

'is'.pluralize # => 'are'

(我没有测试解决方案,但它应该可以工作。)

答案 2 :(得分:2)

总之,我会选择:

配置

# inflections.rb
Inflector.inflections do |inflection|
  inflection.irregular "is", "are"
  inflection.irregular "has", "have"
end

Rails 3

"#{subject} #{'is'.pluralize(count)} working!"

Rails 2

# application_helper.rb
def signularize_or_pluralize(word, count)
  if count.to_i == 1
    word.singularize
  else
    word.pluralize
  end
end

# in the view view
"#{subject} #{signularize_or_pluralize('is', count)} working!"

答案 3 :(得分:1)

另一种选择是使用rails附带的i18n翻译库。

这允许您使用单数和复数版本定义单词或句子(带插值)。

虽然看起来似乎过于复杂,但我强烈建议在开始时为每个项目使用i18n,因为它不仅是主动记录错误的合理位置,而且还可以让您的应用程序为另一种语言的部署做好准备。

它还提供了许多额外的插件和日期和时间本地化的好处。从里面here了解i18n