Added custom validator for UTF-8 strings.
authorMatt Amos <zerebubuth@gmail.com>
Wed, 29 Oct 2008 16:27:15 +0000 (16:27 +0000)
committerMatt Amos <zerebubuth@gmail.com>
Wed, 29 Oct 2008 16:27:15 +0000 (16:27 +0000)
app/models/message.rb
lib/validators.rb [new file with mode: 0644]

index a85de22..464c550 100644 (file)
@@ -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 (file)
index 0000000..095fb7a
--- /dev/null
@@ -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