diff --git a/lib/perspectives/properties.rb b/lib/perspectives/properties.rb index 7cb3fed..9ca6b86 100644 --- a/lib/perspectives/properties.rb +++ b/lib/perspectives/properties.rb @@ -28,6 +28,14 @@ def _resolve_partial_class_name(name) Perspectives.resolve_partial_class_name(self.class.to_s.split('::').first, name) end + def _default_collection_param_name(collection_class) + if collection_class.respond_to?(:base_class) + collection_class.base_class.demodulize.downcase + else + collection_class.name.demodulize.downcase + end + end + module ClassMethods def property(name, *names, &block) unless names.empty? @@ -108,7 +116,10 @@ def _setup_nested(name, locals, options, &block) collection = instance_exec(self, &options[:collection]) return unless collection.present? - as = options.fetch(:as, collection.first.class.base_class.name.downcase).to_sym + default_as_name = _default_collection_param_name(collection.first.class) + + as = options.fetch(:as, default_as_name).to_sym + Collection.new(collection.map { |o| klass.new(context, realized_locals.merge(as => o)) }) else klass.new(context, realized_locals) diff --git a/spec/lib/perspectives/properties_spec.rb b/spec/lib/perspectives/properties_spec.rb index ec3dfb4..04dce97 100644 --- a/spec/lib/perspectives/properties_spec.rb +++ b/spec/lib/perspectives/properties_spec.rb @@ -8,6 +8,10 @@ class Properties < Perspectives::Base property(:name) { user.name } nested 'profile' + + nested_collection '/some_name_space/groups/show', + collection: proc { user.groups }, + property: :groups end end @@ -17,10 +21,31 @@ class Profile < Perspectives::Base end end + module ::SomeNameSpace + class Group + def name + "a group" + end + end + module Groups + class Show < Perspectives::Base + param :group + end + end + end + let(:context) { {} } let(:name) { 'Andrew Warner' } let(:blog_url) { 'a-warner.github.io' } - let(:user) { OpenStruct.new :name => name } + let(:groups) do + [ + SomeNameSpace::Group.new, + SomeNameSpace::Group.new + ] + end + let(:user) do + OpenStruct.new :name => name, :groups => groups + end let(:params) { {:user => user} } @@ -28,4 +53,10 @@ class Profile < Perspectives::Base its(:name) { should == 'Andrew Warner' } its(:profile) { should_not be_nil } + + describe '#groups' do + it 'should return a non-nil value' do + expect(subject.groups).not_to be_nil + end + end end