Satya's blog - Ruby on Rails validations
We all know how to validates_presence_of in Rails, right? You can also override the error_messages_for in your helper to customize the errors. Just paste in the source from http://api.rubyonrails.com/ and start hacking. Make sure it's validating the presence of (model)_id, if it's a lookup table column.
Want to make sure a number of lookup table values actually exist? Say you have a number of columns which are drop-downs, whose values come from lookup tables and you're just storing the lookup IDs ((model)_id) in the previous paragraph) in your "main" table. You can do this:
validates_each :employer, :type_of_injury_code, :cause_code do |r,a,v| check_inclusion_in_list r,a,v end def self.check_inclusion_in_list(record,attrib,value,model=nil) if model.nil? model=attrib.to_s.titleize.camelize.gsub(" ","").constantize end unless value.nil? begin model.find(value) rescue ActiveRecord::ActiveRecordError record.errors.add attrib, 'must be selected from list' end end end
The validates_each statement is standard rails; it passes the record,
attribute, and value to the block. Here, the block calls
check_inclusion_in_list. That function gets the model name based on the
attribute name like so:
Next, we run find(value) on the model, and if it can't find record with the given id, an exception is raised and caught, and we add to the record's error stack. Note that a nil value causes this validation to succeed -- you must validates_presence_of :cause_code_id separately!