我有一个模型Question
,它有两个字段question:text
和description: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
答案 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