diff --git a/lib/draper/undecorate.rb b/lib/draper/undecorate.rb index b787286..5381065 100644 --- a/lib/draper/undecorate.rb +++ b/lib/draper/undecorate.rb @@ -6,4 +6,12 @@ module Draper object end end + + def self.undecorate_chain(object) + if object.respond_to?(:decorated?) && object.decorated? + undecorate_chain(object.object) + else + object + end + end end diff --git a/spec/draper/undecorate_chain_spec.rb b/spec/draper/undecorate_chain_spec.rb new file mode 100644 index 0000000..00e4c9a --- /dev/null +++ b/spec/draper/undecorate_chain_spec.rb @@ -0,0 +1,20 @@ +require 'spec_helper' + +describe Draper, '.undecorate_chain' do + let!(:object) { Model.new } + let!(:decorated_inner) { Class.new(Draper::Decorator).new(object) } + let!(:decorated_outer) { Class.new(Draper::Decorator).new(decorated_inner) } + + it 'undecorates full chain of decorated objects' do + expect(Draper.undecorate_chain(decorated_outer)).to equal object + end + + it 'passes a non-decorated object through' do + expect(Draper.undecorate_chain(object)).to equal object + end + + it 'passes a non-decorator object through' do + object = Object.new + expect(Draper.undecorate_chain(object)).to equal object + end +end