Embellishing String (or whatever) for AR attributes

Forgive my extreme noobishness, but why doesn’t the following work?

class Wombat < ActiveRecord::Base
validates_presence_of :name

class String
def normalize
self.upcase
end
end

def name=(name)
write_attribute(:name, name.normalize)
end
end

Of course I’d want to put the embellishment of String in a module, but
I’m just trying to get it working. But instead I get:

w = Wombat.new(:name => “test”)
NoMethodError: undefined method normalize' for "test":String from (irb):25:inname=’
from /usr/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/
active_record/base.rb:1672:in send' from /usr/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/ active_record/base.rb:1672:inattributes=’
from /usr/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/
active_record/base.rb:1671:in each' from /usr/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/ active_record/base.rb:1671:inattributes=’
from /usr/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/
active_record/base.rb:1505:in initialize_without_callbacks' from /usr/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/ active_record/callbacks.rb:225:ininitialize’
from (irb):29:in `new’
from (irb):29

So what’s the right way to do this? I just want to do better than:

def name=(name)
write_attribute(:name, normalize(name))
end

class Wombat < ActiveRecord::Base
validates_presence_of :name

class String
def normalize
self.upcase
end
end

Move this String class block outside of the Wombat class block.

Eventually move it into say RAILS_ROOT/lib/local/string.rb and then add
“require ‘local/string’” to your environment.rb or some such.

-philip

On Sep 1, 12:56 am, Philip H. [email protected] wrote:

Move this String class block outside of the Wombat class block.

Eventually move it into say RAILS_ROOT/lib/local/string.rb and then add
“require ‘local/string’” to your environment.rb or some such.

-philip

Thanks. Perfect.