有没有办法在模型而不是视图中使用复数()?

Posted

技术标签:

【中文标题】有没有办法在模型而不是视图中使用复数()?【英文标题】:Is there a way to use pluralize() inside a model rather than a view? 【发布时间】:2011-10-11 23:57:00 【问题描述】:

似乎pluralize 只能在视图中使用——我的模型是否也可以通过某种方式使用pluralize

【问题讨论】:

【参考方案1】:

将此添加到您的模型中:

include ActionView::Helpers::TextHelper

【讨论】:

如果我想在所有模型中添加它的快速方法? @coorasse 将其添加为所有模型都继承自的基本模型。 不要用很多不需要的方法污染你的模型,只需看看下面@Tom Rossi 的答案。好多了。【参考方案2】:

你可以在你的模型中添加这样的方法

  def self.pluralize(word)
    ActiveSupport::Inflector.pluralize(word)
  end

并以这种方式调用它

City.pluralize("ruby")
=> "rubies"

【讨论】:

您建议的内容已经内置在字符串中,例如“ruby”.pluralize。我认为问题是关于 ActionView::Helpers::TextHelper 的复数(数字,单词)方法。 谢谢。正是我需要的:) 这与视图中使用的复数辅助函数不同。查看@Sam Ruby 的回答【参考方案3】:

我最喜欢的方式是在我的应用程序中创建一个 TextHelper,将这些作为类方法提供给我的模型:

app/helpers/text_helper.rb

module TextHelper                       
  extend ActionView::Helpers::TextHelper
end                                     

app/models/any_model.rb

def validate_something
  ...
  errors.add(:base, "#TextHelper.pluralize(count, 'things') are missing")
end

在你的模型中包含 ActionView::Helpers::TextHelper 是可行的,但是你也会在你的模型中添加很多不需要的辅助方法。

您的模型中复数方法的来源也不太清楚。此方法使其明确 - TextHelper.pluralize

最后,您不必为每个想要复数的模型添加包含;你可以直接在 TextHelper 上调用它。

【讨论】:

【参考方案4】:

我没有扩展东西,而是这样:

ActionController::Base.helpers.pluralize(count, 'mystring')

希望这对其他人有帮助!

【讨论】:

非常有帮助。这种情况通常只在模型或控制器中出现一次。既然可以一次性完成,为什么还要添加新行! 我建议你这样做,除非你真的需要在你的模型中使用视图助手(你可能不应该这样做)。如果您只在顶部包含ActionController::Base.helpers,那么pluralize 被从哪里拉入并在未来引起混乱就不太明显了。通过这样做,您还包括所有其他帮助者。我怀疑那里有性能损失,但肯定有代码味道。【参考方案5】:

这在 Rails 5.1 中对我有用(参见第二种方法,第一种方法是调用它。)

# gets a count of the users certifications, if they have any.
def certifications_count
  @certifications_count = self.certifications.count
  unless @certifications_count == 0 
    return pluralize_it(@certifications_count, "certification")
  end
end

# custom helper method to pluralize.
def pluralize_it(count, string)
  return ActionController::Base.helpers.pluralize(count, string)
end

【讨论】:

以上是关于有没有办法在模型而不是视图中使用复数()?的主要内容,如果未能解决你的问题,请参考以下文章

anylogic时间折线图的模型开始时间可以为复数吗?

Backbone:删除模型而不丢失视图

有没有办法更新视图中的模型?

通过钩子而不是使用模板将视图中的字段替换为图像的方法

2个页面可以使用相同的视图模型吗?

IOS 有没有办法在点击通知上的“视图”后将用户发送到特定视图?