如何在rails模型中大写每个句子的第一个字符

时间:2014-06-26 19:17:10

标签: ruby-on-rails ruby

我有一个模型Question,它有两个字段question:textdescription:text。我想通过使用before_save回调来大写两个字段的每个句子的第一个字符。最好的方法是什么?感谢

这个问题与标记为重复的问题不同,因为答案仅针对ruby代码,但我的问题为rails代码提供了答案,它有助于初学者理解逻辑。

如何让它变干?

class Question < ActiveRecord::Base
before_save :capitalize_values

  def capitalize_values
    self.question = question.split('.').map(&:strip).map { |s|
                      s[0].upcase + s[1..-1] + '.'
                    }.join(' ')  unless question.blank?
    self.description = description.split('.').map(&:strip).map { |s| 
                         s[0].upcase + s[1..-1] + '.'
                       }.join(' ') unless description.blank?
  end
end

2 个答案:

答案 0 :(得分:4)

class Question < ActiveRecord::Base
  before_save :capitalize_attributes

  def capitalize_attributes
    self.question = capitalize_sentences(question)
    self.description = capitalize_sentences(description)
  end

  def capitalize_sentences(string)
    unless string.blank?
      string.split('.').map do |sentence|
        sentence.strip.capitalize
      end.join(' ')
    end
  end
end

答案 1 :(得分:1)

将字符串拆分成单个句子并非易事,如下所述:rails-gem-to-break-a-paragraph-into-series-of-sentences

如果你不介意天真的近似,你也可以使用:

split(/(?<=[?.!])/)

所以在那之后你可以这样干它:

[:question, :description].each do |atr|
  value = send(a).split(/(?<=[?.!])/).map(&:capitalize).join(" ")
  send("#{a}=", value)
end

您可以使用send / read_attribute而不是write_attribute,而是在此处查看差异:set-attributes-in-activerecord