From 32b280eb8dfd11d03646cb89c339d2b938f06a6e Mon Sep 17 00:00:00 2001 From: Matt Amos Date: Wed, 29 Oct 2008 16:27:15 +0000 Subject: [PATCH 1/1] Added custom validator for UTF-8 strings. --- app/models/message.rb | 3 +++ lib/validators.rb | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+) create mode 100644 lib/validators.rb diff --git a/app/models/message.rb b/app/models/message.rb index a85de2231..464c55028 100644 --- a/app/models/message.rb +++ b/app/models/message.rb @@ -1,3 +1,5 @@ +require 'validators' + class Message < ActiveRecord::Base belongs_to :sender, :class_name => "User", :foreign_key => :from_user_id belongs_to :recipient, :class_name => "User", :foreign_key => :to_user_id @@ -6,4 +8,5 @@ class Message < ActiveRecord::Base validates_length_of :title, :within => 1..255 validates_inclusion_of :message_read, :in => [ true, false ] validates_associated :sender, :recipient + validates_as_utf8 :title end diff --git a/lib/validators.rb b/lib/validators.rb new file mode 100644 index 000000000..095fb7af9 --- /dev/null +++ b/lib/validators.rb @@ -0,0 +1,32 @@ +module ActiveRecord + module Validations + module ClassMethods + + # error message when invalid UTF-8 is detected + @@invalid_utf8_message = " is invalid UTF-8" + + ## + # validation method to be included like any other validations methods + # in the models definitions. this one checks that the named attribute + # is a valid UTF-8 format string. + def validates_as_utf8(*attrs) + validates_each(attrs) do |record, attr, value| + record.errors.add(attr, @@invalid_utf8_message) unless valid_utf8? value + end + end + + ## + # Checks that a string is valid UTF-8 by trying to convert it to UTF-8 + # using the iconv library, which is in the standard library. + def valid_utf8?(str) + return true if str.nil? + Iconv.conv("UTF-8", "UTF-8", str) + return true + + rescue + return false + end + + end + end +end -- 2.43.2