Always when I begin to think that I’m getting better and better in
mastering Ruby I stumble upon some strange behavior that I don’t
understand…
class Country < ActiveRecord::Base
validates_presence_of :abbrevation
validates_presence_of :name
validates_format_of :abbrevation,
:with => /[a-z]{2}/i,
:message => self.error_messages[:not_allowed_chars_in_abbrevation]
def self.error_messages
{ :not_allowed_chars_in_abbrevation => ‘Only characters A-Z are
allowed’}
end
end
This gives me the following error:
usr/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/base.rb:1235:in method_missing': undefined local variable or methoderror_messages’
for Country:Class (NameError)
from
/Users/Josh/Webwork/pgbookings/config/…/app/models/country.rb:6
…
And I don’t have a clue what’s wrong here… :-/ Thanks for a hint.
Josh
usr/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/base.rb:12 35:in method_missing': undefined local variable or method error_messages’
for Country:Class (NameError)
from
/Users/Josh/Webwork/pgbookings/config/…/app/models/country.rb:6
Try putting the definition of error_messages above the place where you
use it.
class Country < ActiveRecord::Base
validates_presence_of :abbrevation
validates_presence_of :name
def self.error_messages
{ :not_allowed_chars_in_abbrevation => ‘Only characters A-Z are
allowed’}
end
def after_validation @errors.add(:abbrevation,
self.error_messages[:not_allowed_chars_in_abbrevation]) if
!@errors.on(:abbrevation) and @abbrevation !~ /^[a-z]{2}$/i
end
end
Now I’m getting such nasty errors againa! Why?
NoMethodError: undefined method error_messages' for #<Country:0x25b3c58> /usr/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/base.rb:1860:inmethod_missing’
/Users/Josh/Webwork/pgbookings/config/…/app/models/country.rb:10:in
`after_validation’
…
{ :not_allowed_chars_in_abbrevation => 'Only characters A-Z are
Now I’m getting such nasty errors againa! Why?
NoMethodError: undefined method error_messages' for #<Country:0x25b3c58> /usr/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/base.rb:1860:in method_missing’
/Users/Josh/Webwork/pgbookings/config/…/app/models/country.rb:10:in
`after_validation’
Like most questions about Ruby, it comes down to:
an object can have its own methods
classes are objects too
You’ve defined error_messages as a singleton method for your class (a
class method), but then you’re trying to call it on a totally
different object, namely an instance of your class.
I’m just wondering… Already some years ago since I used Java.
I don’t know (I’m not a Java programmer), but someone probably does In Ruby, you can do:
class MyClass
def self.some_class_method
# …
end
def an_instance_method
self.class.some_class_method
end
end
Basically, as long as you can get hold of an object that understands
what you’re asking it to do (in this case, the object in question is
self.class), you can ask it to do it.
Well I wouldn’t say that they work exactly the same… You can’t call a
class method on an instance directly (foo.some_class_method), but you
can call it on the class of the instance (foo.class.some_class_method).
In java, you can call the static method on the instance but it’s a
compiler warning (“Static method should be accessed in a static way”)…
you’re supposed to call static methods on the class itself.