缘由
在日常开发中,有时候会碰到要将一些单词按照它的数量来按单复数显示
所幸rails已经考虑到了这一点,在ActionView中有一个方法
There are <%= pluralize @user.size, "user" %>.
例子
pluralize(1, 'person') # => 1 person pluralize(2, 'person') # => 2 people pluralize(3, 'person', 'users') # => 3 users pluralize(0, 'person') # => 0 people
深入研究pluralize方法:
def pluralize(count, singular, plural = nil)
"#{count || 0} " + ((count == 1 || count =~ /^1(\.0+)?$/) ? singular : (plural || singular.pluralize)) end
可以看到英语单词的单复数是由String#pluralize方法提供,这个是由ActiveSupport::Inflector提供的一个扩展方法
在rails console里运行
"post".pluralize # => "posts" "octopus".pluralize # => "octopi" "sheep".pluralize # => "sheep" "words".pluralize # => "words" "CamelOctopus".pluralize # => "CamelOctopi"
继续研究ActiveSupport::Inflector.pluralize
def pluralize(word) result = word.to_s.dup if word.empty? || inflections.uncountables.include?(result.downcase) result else inflections.plurals.each { |(rule, replacement)| break if result.gsub!(rule, replacement) } result end end
可以看到单词的单复数的匹配设置是在inflection.pluarls里,那要如何修改呢? rails已经有一个配置文件了,
在/paht/to/site/config/initializers/inflections.rb
ActiveSupport::Inflector.inflections do |inflect| inflect.plural /^(ox)$/i, '\1en' inflect.singular /^(ox)en/i, '\1' inflect.irregular 'person', 'people' inflect.uncountable %w( fish sheep ) end
plural和singual是匹配单复数的通用匹配规则,irregular是处理那些特殊单词变化,uncountbale就是那些单复数一样的单词