From 44bda4b19e112f9e315710d25484b82d403cf41f Mon Sep 17 00:00:00 2001 From: Amiel Martin Date: Tue, 22 Apr 2014 14:05:55 -0700 Subject: [PATCH] Draper.undecorate safely undecorates any object This allows you to pass any object to Draper.undecorate knowing you will get the original object back even if the object passed in does is not already decorated. Closes #600 --- lib/draper.rb | 1 + lib/draper/undecorate.rb | 9 +++++++++ spec/draper/undecorate_spec.rb | 19 +++++++++++++++++++ 3 files changed, 29 insertions(+) create mode 100644 lib/draper/undecorate.rb create mode 100644 spec/draper/undecorate_spec.rb 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