Search code examples
ruby-on-railsrubyvalidationruby-on-rails-4web

Pass field name as parameter to custom validation method Rails 4


I have a custom validation method:

def my_custom_validation
  errors.add(specific_field, "error message") if specific_field.delete_if { |i| i.blank? }.blank?
end

The goal is to disallow parameters which contains [""] pass through validation, but I need to call this method like:

validate :my_custom_validation #and somehow pass here my field names

For example:

 validate :my_custom_validation(:industry) 

Solution

  • Since you need to validate multiple attributes this way I would recommend a custom validator like so:

    class EmptyArrayValidator < ActiveModel::EachValidator
      def validate_each(record, attribute, value)
        record.errors[attribute] << (options[:message] || "cannot be emtpy") if value.delete_if(&:blank?).empty?
      end
    end
    

    Then validate as

    validates :industry, empty_array: true
    validates :your_other_attribute, empty_array: true
    

    Or if you don't want to specifically create a class because it is only needed for 1 model you could include this in the model itself

    validates_each :industry, :your_other_attribute, :and_one_more do |record, attr, value|
      record.errors.add(attr, "cannot be emtpy") if value.delete_if(&:blank?).empty?
    end