如何避免在ruby / rails中缩写缩写词

时间:2013-09-24 16:46:13

标签: ruby-on-rails ruby

我有一个包含“IT Professional”或“DB Administrator”等标题的字段。 我想在句子的中间显示这个,所以需要小写。不幸的是,这也缩小了首字母缩略词,我最终得到了“感谢加入其专业人士社区”。

一个好的开始是下面的Grantovich提到的解决方案,即在config/initializers/inflections.rb中指定我的首字母缩略词:

ActiveSupport::Inflector.inflections do |inflect|
  inflect.acronym "IT"
  inflect.acronym "DB"
end

走这条路的问题在于,首先,我不想将它们作为解决方案的一部分建议小写,因为它们是标题,应该用大写字母存储。其次,它们已经用大写字母定义,突然把它们放在小写字母上是一个坏主意。

找到解决方案:由于我希望标题出现在句子的中间,因此需要小写,我通过降低标题,构造句子然后在其上调用#humanize来解决它。 Humanize将把句子的第一个字母和任何定义的首字母缩略词大写。

4 个答案:

答案 0 :(得分:5)

如果我们假设通过首字母缩略词,你的意思是你的字符串中的任何单词由一行中的2个或更多个大写字母组成,那么你可以这样做:

def smart_case(field)
  field.to_s.split(' ').map { |word|
    /[A-Z][A-Z]+/.match(word) ? word : word.downcase
  }.join(' ')
end

答案 1 :(得分:5)

如果可能,我会将字符串存储为“IT专业人员”,“数据库管理员”等,所有字母除了已缩小的首字母缩略词外。然后,您可以add your acronyms to the inflector并在需要时使用#titleize转换为标题案例。在边缘情况和代码维护负担方面,这是一个比编写自己的代码来做“选择性下行”更好的解决方案。

答案 2 :(得分:1)

这是一种丑陋的方式,但是:

def format_me(str)
  str.downcase!
  @acronymn_words = ["IT Professional", "DB Administrator"]
  @acronymn_words.each do |a|
    if str.include? a.downcase
      str.gsub!(a.downcase,a)
    end
  end
  capitalize_next = true
  str = str.split.map  do |word|
    if capitalize_next then word.capitalize! end 
    capitalize_next = word.end_with?(".","!","?")
    word
    end.join(" ")
end

除非你知道你正在寻找的确切字符串,否则这将难以维护,但它会根据你请求的项目推出格式正确的句子。

答案 3 :(得分:0)

我会这样做:

do_not_downcase = ["IT", "DB"] # Complete the list with your favourites words
res = ""
str.split(" ").each do |word|
    if !do_not_downcase.include? word then
        res += word.downcase + " "
    else
        res += word + " "
    end
end

puts res

>welcome IT professionals