diff --git a/lib/active_decorator/decorator.rb b/lib/active_decorator/decorator.rb index 3449d51a..5f2ae17c 100644 --- a/lib/active_decorator/decorator.rb +++ b/lib/active_decorator/decorator.rb @@ -36,16 +36,21 @@ def to_a_with_decorator def decorator_for(model_class) return @@decorators[model_class] if @@decorators.has_key? model_class - decorator_name = "#{model_class.name}Decorator" - d = decorator_name.constantize - unless Class === d - d.send :include, ActiveDecorator::Helpers - @@decorators[model_class] = d - else - @@decorators[model_class] = nil + (model_class.ancestors - model_class.included_modules).find do |candidate| + decorator_name = "#{candidate.name}Decorator" + + begin + d = decorator_name.constantize + + unless Class === d + d.send :include, ActiveDecorator::Helpers + @@decorators[model_class] = d + return d + end + rescue NameError + next + end end - rescue NameError - @@decorators[model_class] = nil end end end diff --git a/spec/decorator_spec.rb b/spec/decorator_spec.rb new file mode 100644 index 00000000..2e9aa542 --- /dev/null +++ b/spec/decorator_spec.rb @@ -0,0 +1,30 @@ +require 'spec_helper' + +describe ActiveDecorator::Decorator do + subject do + ActiveDecorator::Decorator.instance + end + + describe '#decorator_for' do + context 'when a decorator exists' do + it 'returns the decorator' do + subject.send(:decorator_for, Parent).should == ParentDecorator + end + end + + context 'when a parent decorator exists' do + it 'returns the decorator' do + subject.send(:decorator_for, Child).should == ParentDecorator + end + end + end +end + +class Parent +end + +class Child < Parent +end + +module ParentDecorator +end