Я придумал новый валидатор, который выполняет усечение.Вот как я это сделал:
Я создал папку «validators» внутри папки «app», а затем создал файл «length_truncate_validator.rb» со следующим содержимым:
class LengthTruncateValidator < ActiveModel::EachValidator
def validate_each(record, attribute, value)
ml = options[:maximum]
record.send("#{attribute}=", value.mb_chars.slice(0,ml)) if value.mb_chars.length > ml unless value.nil? or ml.nil?
end
class << self
def maximum(record_class, attribute)
ltv = record_class.validators_on(attribute).detect { |v| v.is_a?(LengthTruncateValidator) }
ltv.options[:maximum] unless ltv.nil?
end
end
end
Ивнутри моего модельного класса у меня есть что-то вроде:
class Book < ActiveRecord::Base
validates :title, :length_truncate => {:maximum => 10}
end
, что очень удобно и работает так, как мне нужно.
Но все же, если вы думаете, что это можно улучшить или сделать впо-другому, пожалуйста.