diff --git a/lib/draper.rb b/lib/draper.rb index f5b1fbc..b25a2a7 100644 --- a/lib/draper.rb +++ b/lib/draper.rb @@ -22,6 +22,7 @@ require 'draper/decorated_association' require 'draper/helper_support' require 'draper/view_context' require 'draper/collection_decorator' +require 'draper/undecorate' require 'draper/decorates_assigned' require 'draper/railtie' if defined?(Rails) diff --git a/lib/draper/undecorate.rb b/lib/draper/undecorate.rb new file mode 100644 index 0000000..b787286 --- /dev/null +++ b/lib/draper/undecorate.rb @@ -0,0 +1,9 @@ +module Draper + def self.undecorate(object) + if object.respond_to?(:decorated?) && object.decorated? + object.object + else + object + end + end +end diff --git a/spec/draper/undecorate_spec.rb b/spec/draper/undecorate_spec.rb new file mode 100644 index 0000000..c0aff84 --- /dev/null +++ b/spec/draper/undecorate_spec.rb @@ -0,0 +1,19 @@ +require 'spec_helper' + +describe Draper, '.undecorate' do + it 'undecorates a decorated object' do + object = Model.new + decorator = Draper::Decorator.new(object) + expect(Draper.undecorate(decorator)).to equal object + end + + it 'passes a non-decorated object through' do + object = Model.new + expect(Draper.undecorate(object)).to equal object + end + + it 'passes a non-decorator object through' do + object = Object.new + expect(Draper.undecorate(object)).to equal object + end +end