undefined method `model_name in partial .. passing an Array as a collection

In the controller , I am passing an Array as a collection @objects = ["item1", "item2", "item3", "item4"]

in the view I wrote %table#objects     = render :partial => 'object', :collection => @objects

and in my partial _object.html = content_tag_for(:tr, @object) do   %td= @object   %td= link_to........

but I got an error : undefined method `model_name' for NilClass:Class for the #object in the content_tag

@object is not not a class..... (yet) I just to want to test on an Array of string .... anyway of doing such thing ?

thanks for your feedback

In the controller , I am passing an Array as a collection @objects = ["item1", "item2", "item3", "item4"]

in the view I wrote %table#objects = render :partial => 'object', :collection => @objects

and in my partial _object.html = content_tag_for(:tr, @object) do %td= @object %td= link_to........

but I got an error : undefined method `model_name' for NilClass:Class for the #object in the content_tag

@object is not not a class..... (yet) I just to want to test on an Array of string .... anyway of doing such thing ?

@object isn't set - you should be using object (since that's what render will be filling with the items from @objects

Fred

Thanks fred.. I tried with object but same error.. it seems model_name_from_record_or_class is needed when using collection I may have to change the partial rendering ... ?

-- trace activemodel (3.0.4) lib/active_model/naming.rb:94:in `model_name_from_record_or_class' activemodel (3.0.4) lib/active_model/naming.rb:81:in `singular' actionpack (3.0.4) lib/action_controller/record_identifier.rb:49:in `dom_class' actionpack (3.0.4) lib/action_view/helpers/record_tag_helper.rb:58:in `content_tag_for' app/views/admin/remote_lockers/_object.html.haml:1:in `_app_views_admin_remote_lockers__object_html_haml__3334574884651529235_2179828200_2175116202532159367' actionpack (3.0.4) lib/action_view/template.rb:135:in `block in render' activesupport (3.0.4) lib/active_support/notifications.rb:54:in `instrument' actionpack (3.0.4) lib/action_view/template.rb:127:in `render' actionpack (3.0.4) lib/action_view/render/partials.rb:300:in `block in collection_with_template' actionpack (3.0.4) lib/action_view/render/partials.rb:297:in `each' actionpack (3.0.4) lib/action_view/render/partials.rb:297:in `collection_with_template' actionpack (3.0.4) lib/action_view/render/partials.rb:280:in `render_collection'

to avoid being confused with 'object' litteral .. I modified the test code as following :

#lockers   %table#items     = render :partial => 'item', :collection => ['foo', 'bar', 'baz']

and the _item partial

= content_tag_for(:tr, item) do   %td= item

this time , the error is : undefined method `model_name' for String:Class

I believe there is something wrong with the content_tag_for...

to avoid being confused with 'object' litteral .. I modified the test code as following :

#lockers %table#items = render :partial => 'item', :collection => ['foo', 'bar', 'baz']

and the _item partial

= content_tag_for(:tr, item) do %td= item

this time , the error is : undefined method `model_name' for String:Class

I believe there is something wrong with the content_tag_for...

Oops, hadn't spotted that you were using content_tag for as opposed to content_tag. The entire point of content_tag_for is that you give it an activemodel like object and it will set the dom id & css class appropriately. If you don't have such objects (eg you have strings instead), then don't use content_tag_for. content_tag might be what you're looking for.

Fred

thanks you confirm it .. I noticed it as I change my test code using the array as the collection .... it's fine now ... using content_tag obvious thing doesn't appears at first glance !!

you are using the partial in the wrong way.

when you use :collection => @objects

it will pass each element of the collection into the partial and create ‘object’ which is created based

on the name of the partial ‘_name’. the same thing happens with

:partial ‘thing’, :object => Thing.new

_thing.haml

= thing # this is the :object, based on the name

also call your partial .haml if it is haml.