symbol pointing to a method idiom in ror model

IN NEED OF EXPLANATION:

class Comment < ActiveRecord::Base     validate :must_be_friends

    def must_be_friends       errors.add_to_base("Must be friends to leave a comment")                  unless commenter.friend_of?(commentee)     end end

The above code comes from rails documentation. There is a similar example inAgile Web Development with Rails by Dave Thomas and Sam Ruby.

my understanding is that:                 validate :must_be_friends is a method call to the validate method within the ActiveRecord::Base class. Supposedly it's contents are:                   def validate                   end

This of course does not work with ruby because the validate method does not take parameters.

Is metaporgramming being used? Tnis seems like some sort of Rails idiom.

Please explain.

I'm trying to get back into Rails after my first attempt.

TIA, Pete

It's a stub of sorts. When you use "validate :some_symbol" in your model, it's basically adding that symbol to a stack that it's going to invoke "model_instance.send(:some_symbol)" (more or less) on when validation happens.

This of course does not work with ruby because the validate method does not take parameters.

Is metaporgramming being used? Tnis seems like some sort of Rails idiom.

Not really: there are two validate methods. One is an instance method that takes no arguments, the other is a class method that takes a method name or block and adds it to the list of validations to run (this is slightly hidden by the fact that that method comes from the ActiveSupport callback stuff)

Fred