hi matty. I just want to pick up on a couple of points that suggest to me that you have been mislead in some way or you have misunderstood something
rails documentation stress keeping the logic in the head not in the db
That's not strictly true. Rails stresses that validations and businss logic should be kept firmly in the model or middle tier layer this is mainly because programmers are lazy and undisciplined and will dot their business logic around their controllers, in their views and anywhere else it is possbile to put it rather than in model where it firmly belongs.
to the absolute contrary of your impression It is extremely good practice and very desirable to have your database stucture back up your business logic with fk constraints, indexes etc... so do both
is it possible and plausible to take user data from a form, validate it against a pre-built table and if valid enter it into the user table or give the user an error if invalid?
Yes, and very simple to do.
use the user model directly and write some custom validation routines to validate the input data against your standing data. See here for the best approach to this
The other question I have is where to put the code. The documentation says to keep the controllers skinny, so I would tend to put this in the model, but doesn't the controller handle the incoming input?
hope my last answer covers this.
forms are posted back to the server. your routes.rb file dtermines what should be done with the url that your server receives and in this case it's likely going to be a PUIT or a POST request to the user controller which means that if you are using restfull routes your update or create actions will be called.
These have the responsibilitiy of marshalling the data into the right objects and rendering the correct response back to the browser. The objects have the responsibility of validating any data and raising errors if there are any problems. the controller action in it's most basic form will render errors or redirect to an appropriate action dep[ending on the result of a call to create/update a user model in your instance.
What you want and what you need are too often not the same thing!
When your head is hurting from trying to solve a problem, stop standing on it. When you are the right way up you will see the problem differently and you just might find the solution.
(Quote by me 15th July 2009)