How can I make Rails ActiveRecord automatically truncate values set to attributes with maximum length?

Well, if you want the value truncated if its too long, you don't really need a validation, because it will always pass. I'd handle that like this:

class Book < ActiveRecord::Base
  before_save :truncate_values
  def truncate_values
    self.title = self.title[0..9] if self.title.length > 10
  end
end

I have come up with a new validator that does truncation. Here is how I did that:

I created the "validators" folder inside "app" folder and then created the file "length_truncate_validator.rb" with the following content:

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

And inside my model class I have something like:

class Book < ActiveRecord::Base

  validates :title, :length_truncate => {:maximum => 10}

end

which is quite handy and works the way I require.

But still, if you think that this one can be improved or done in another way, you are welcome.