Validating only attributes that are present in a form
You just need to change the method call from skip_validation to strip_validations.

before_validation :strip_validations

    def strip_validations
      ['teacher_number', 'title', 'name', 'gender', 'location', 'dob', 'contact_mobile', 'contact_home', 'street', 'city', 'state', 'zip_code', 'country'].each do |attr|

        errors.add("Teacher", " #{attr} can't be blank") if send(attr.to_sym) &amp;&amp; send(attr.to_sym).blank?

      end
    end


for more specific error messages you can use

errors.add("Teacher", {attr =&gt; " #{attr} can't be blank"}) if send(attr.to_sym) &amp;&amp; send(attr.to_sym).blank?