ActiveRecord - replace model validation error with warning

activerecord, extension-methods, ruby-on-rails, validation

Solution

I don't know if it's ready for Rails 3, but this plugin does what you are looking for:

http://softvalidations.rubyforge.org/

Edited to add:

To update the basic functionality of this with ActiveModel I came up with the following:

#/config/initializer/soft_validate.rb:
module ActiveRecord
  class Base
    def warnings
      @warnings ||= ActiveModel::Errors.new(self)
    end
    def complete?
      warnings.clear
      valid?
      warnings.empty?
    end
  end
end

#/lib/soft_validate_validator.rb
class SoftValidateValidator < ActiveModel::EachValidator
  def validate(record)
    record.warnings.add_on_blank(attributes, options)
  end
end

It adds a new Errors like object called warnings and a helper method complete?, and you can add it to a model like so:

class FollowupReport < ActiveRecord::Base
  validates :suggestions, :soft_validate => true
end

Problem

I want to be able to replace a field error with a warning when saving/updating a model in rails. Basically I want to just write a wrapper around the validation methods that'll generate the error, save the model and perhaps be available in a warnings hash (which works just like the errors hash): ``` class Person < ActiveRecord::Base # normal validation validates_presence_of :name # validation with warning validates_numericality_of :age, :only_integer => true, :warning => true # <-- only warn end >>> p = Person.new(:name => 'john', :age => 2.2) >>> p.save => true # <-- able to save to db >>> p.warnings.map { |field, message| "#{field} - #{message}" } ["age - is not a number"] # <-- have access to warning content ``` Any idea how I could implement this? I was able to add `:warning => false` default value to `ActiveRecord::Validations::ClassMethods::DEFAULT_VALIDATION_OPTIONS` By extending the module, but I'm looking for some insight on how to implement the rest. Thanks.

Original source