在rails 4中没有计数的复数

Posted

技术标签:

【中文标题】在rails 4中没有计数的复数【英文标题】:pluralize without count number in rails 4 【发布时间】:2015-01-30 07:08:03 【问题描述】:

我正在构建一个博客应用程序。如果多个“帖子”是“已发布”,我希望能够将“文章”一词复数。

像这样: 可用文章 要么 可用文章

这就是我所拥有的......

 Available <%=  pluralize @posts.published, "Article" %>:

我试过了

 Available <%=  pluralize @posts.published.count, "Article" %>:

这行得通……但我不想要这个数字。它不应该读作 Available 5 Articles....它应该没有数字。

【问题讨论】:

【参考方案1】:

我自己一直在寻找这个问题的答案,但对现有的任何一个都不满意。这是我找到的最整洁的解决方案:

 Available <%=  "Article".pluralize(@posts.published.count) %>:

文档是here。相关位:

返回字符串中单词的复数形式。

If the optional parameter count is specified,
the singular form will be returned if count == 1.
For any other value of count the plural will be returned.

  'post'.pluralize             # => "posts"
  'apple'.pluralize(1)         # => "apple"
  'apple'.pluralize(2)         # => "apples"

【讨论】:

它只适用于英语!在葡萄牙语中,我们还有其他复数形式。所以它不是最好的答案。 @JonatasTeixeira 您可以将语言环境作为第二个参数传递。【参考方案2】:

您可以使用Rails Internationalization (I18n) 来完成此操作。在您的config/data/en.yml 中,您的翻译将是这样的:

en:
  available_articles:
    zero: Available Article
    one: Available Article
    other: Available Articles

在您看来,您应该能够得到这样的翻译:

<%= t(:available_articles, count: @posts.published.count) %> 

【讨论】:

这样做对 Hetal Khunti 的回答有好处吗?我想接受你的回答,因为我想要一个 Hetal 的替代品......但如果替代品不太干净,我想知道( 好吧,我想说这种方法会带来更易读的视图,但我正在处理的项目已将所有内容都本地化,所以这是我习惯看到的。这种方式的另一个好处是,如果你想在计数为零时更改措辞,那相当简单。 Great Jakob.. 新东西要学.. 1+ 用于其他解决方案Rails Internationalization (I18n) 我的 en.yml 中有 &lt;%= I18n.t('items', count: @size) %&gt; en: items: zero: no items one: one item other: %count items。我收到一个错误在第 26 行第 12 列扫描下一个令牌时无法启动任何令牌的字符> @Suraj 您不能以“%”字符开始翻译,所以只需将其括在引号中,即other: "%count items"【参考方案3】:

是的,我这样做了,我非常喜欢:

- if @post.comments.persisted.any?
    h4
      = t(:available_comments, count: @post.comments.count)
    = render @post.comments.persisted
  - else
    p
      | There are no comments for this post.
en:
  available_comments:
    one: "%count Comment"
    other: "%count Comments"

感谢@Jakob W!

【讨论】:

【参考方案4】:

您可以使用&lt;%= @posts.published.count &gt; 0 ? "Available Article".pluralize(@posts.published.count) : nil %&gt;:

【讨论】:

无论计数是否为复数都是复数。 它对我有用。验证 @posts.published.count 是否为您提供了您期望的数字。 它适用于“1”或“many”的计数......但如果计数为“0”,它会复数。 @NothingToSeeHere :检查我的答案 查看我的更新。我以为您不希望显示计数。这假定如果计数为 0 或更少,则不应显示任何内容。【参考方案5】:

这个简单的逻辑怎么样?我想你也想显示文章的数量,如果不是,那么只需删除 &lt;%= @posts.published.count %&gt;

Available <%= @posts.published.count %> 
    <% if @posts.published.count > 1 %>
        Articles
    <% else %>
        Article
    <% end %>

你可以使用ternary operator,

Available <%= @posts.published.count %> <%= if (@posts.published.count > 1) ? "Articles" : "Article" %>

输出:

=> Available 1 Article   # if there is only one article 
=> Available 2 Articles   # if there is more then 1 articles 

【讨论】:

是的,我正在使用它...但我想知道是否有更优雅的方式来使用 rails helpers...等来编写它。谢谢。如果我不那样做,我会接受你的回答。 @NothingToSeeHere :是的,您也可以将三元运算符 ?: 用于单行条件。 condition? true part : false part 这需要调整以考虑到英语使用名词的复数形式来表示零数“Available 0 Articles”。很容易修复。 &lt;% if count == 1 %&gt;Article&lt;% else %&gt;Articles&lt;% end %&gt;

以上是关于在rails 4中没有计数的复数的主要内容,如果未能解决你的问题,请参考以下文章

Rails:按用户分组项目,然后计数状态

由关联计数组成的 Rails 查询,最好使用范围

Ruby/Rails:如何以科学计数法显示数字?

Rails,如何避免对关联中的总数(计数、大小、counter_cache)进行“N + 1”查询?

Rails has_many 关联计数子行

Rails 多对一关系聚合函数(组、计数)活动记录