有没有办法在模型而不是视图中使用复数()?
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
【讨论】:
以上是关于有没有办法在模型而不是视图中使用复数()?的主要内容,如果未能解决你的问题,请参考以下文章