# Ensures values are either the type you expect, a default value or nil. # # Virtus is built to handle data from a database where it's either well formed or nil. We need # to tweak it's return values a little bit for it to handle form data. See https://github.com/solnic/virtus/issues/99. module FormObject include Virtus module ClassMethods def attribute(name, type, opts = {}) super(name, type, opts) define_method(name) do data = super() if data.is_a?(type) data elsif opts[:default] opts[:default].call else nil end end end end def self.included(descendant) super descendant.extend FormObject::ClassMethods end end