Hi, I''ve got a problem on which I''ve spent many hours, and I can''t get a clue on what is happening... I hope someone here will be able to help me. Here is the situation : my Rails app uses acts_as_commentable and acts_as_bookmarkable on a Diagram model. Everything''s working OK individually: I can create a comment on a Diagram, bookmark it, and so on. Now, I''d like to have a list in the "show" view of a diagram, which shows all comments and a line per bookmark saying something like "John added this diagram as a favorite". I''ve got an action in a comments controller fetching the data: # Get bookmarked class from params and fetch the wanted instance model_class Kernel.const_get(params[:commentable][:type].capitalize) instance = model_class.find params[:commentable][:id] report_error("Cannot find " << model_class.to_s << " with id " << params[:commentable][:id].to_s) if instance.nil? @comments = instance.comments # Include bookmarks if model is bookmarkable, and sort bookmarks and comments all together if BookmarksController::BOOKMARKABLE_MODELS.include?(model_class.to_s) @comments += instance.bookmarks @comments = @comments.sort_by {|obj| obj.created_at} end So I fetch all comments for the commentable model (Diagram in my example), then add the bookmarks to the collection and sort everything by creation date. This works fine. I''m displaying this list with a view and some partials: ## index.html.haml = render :partial => "comment", :collection => @comments ## _comment.html.haml (called for each item in @comments) = debug comment = debug comment.user -# The ''comment'' might be a bookmark. Handle it first. - if comment.instance_of?(Bookmark) .bookmark = render :partial => "/comments/comment_bookmark", :locals => { :bookmark => comment } - else .comment{:class => cycle("odd", "even")} = render :partial => "/comments/comment_content", :locals => { :comment => comment} ## _comment_bookmark.html.haml = image_tag "/images/iLight/icon.png" == #{bookmark.user.display_name} lit this diagram <small>(#{time_ago_in_words bookmark.created_at} ago)</small> The problem happens in this last file, when calling bookmark.user.display_name. It raises a Template error: ActionView::TemplateError (You have a nil object when you didn''t expect it! You might have expected an instance of Array. The error occurred while evaluating nil.include?) on line #2 of app/views/comments/_comment_bookmark.html.haml: 1: = image_tag "/images/iLight/icon.png" 2: == #{bookmark.user.display_name} lit this diagram <small>(#{time_ago_in_words bookmark.created_at} ago)</small> First thing, I just can''t see where does this "include?" call comes from :\ I''ve tried calling other attributes/methods on bookmark.user and never get any error. If I just try to output bookmark.user it works and displays "#". As you can see, I''ve got two debug calls in my view. When the partial is called for a Comment, debug displays the following: --- !ruby/object:Comment attributes: comment: pouet created_at: 2010-10-11 00:44:02 title: "" commentable_type: Diagram commentable_id: "29" updated_at: 2010-10-11 00:44:02 id: "41" user_id: "2" attributes_cache: created_at: 2010-10-11 00:44:02 Z --- !ruby/object:User attributes: created_at: 2010-05-23 18:31:02 activated_at: 2010-06-08 22:23:19 send_news: "1" remember_token_expires_at: updated_at: 2010-09-19 22:36:42 activation_code: old_email: id: "2" saved_once: "1" email_hash: 672585615_3008d2bf2e8e7f4455d48212f99a9343 remember_token: short_name: olance diagrams_count: "16" display_name: Olivier Lance attributes_cache: {} When it''s a Bookmark object, it displays: --- !ruby/object:Bookmark attributes: bookmarkable_type: Diagram bookmarkable_id: "29" created_at: 2010-10-11 01:18:41 title: new items updated_at: 2010-10-11 01:18:41 id: "253" user_id: "2" attributes_cache: created_at: 2010-10-11 01:18:41 Z #<User id: 2, created_at: "2010-05-23 18:31:02", updated_at: "2010-09-19 22:36:42", remember_token: nil, remember_token_expires_at: nil, activation_code: nil, activated_at: "2010-06-08 22:23:19", email_hash: "672585615_3008d2bf2e8e7f4455d48212f99a9343", display_name: "Olivier Lance", short_name: "olance", send_news: true, saved_once: true, diagrams_count: 16, old_email: nil, changed_email: nil> I''m suspicious about this difference in the User object output. When I restart my dev server (Mongrel) and refresh the page, the output for the Bookmark''s user looks exactly like the comments ones, and bookmark.user.display_name doesn''t raise any error. Then, if I refresh the page again, I get the above output and the TemplateError exception. I''ve tried to debug using ruby-debug, but couldn''t succeed in breaking on TemplateError or NoMethodError exceptions.... I''ve just spent hours on this, I really don''t get and don''t have a lot of experience in dealing with that kind of issues... I''d really appreciate if someone had an idea on how to fix this or at least to track the bug down! By the way, I''m using Rails 2.3.8 with Ruby 1.8.7 Thanks a lot for reading this and for any help! Olivier Olivier -- Posted via http://www.ruby-forum.com/. -- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
Sorry there''s a mistake in my previous post: Olivier Lance wrote:> First thing, I just can''t see where does this "include?" call comes from > :\ > I''ve tried calling other attributes/methods on bookmark.user and never > get any error. If I just try to output bookmark.user it works and > displays "#".I don''t know what I had in mind... this should read:> I''ve tried calling other attributes/methods on bookmark.user and **always > get the same error**. If I just try to output bookmark.user it works and > displays "#".Hope somebody can help! Olivier -- Posted via http://www.ruby-forum.com/. -- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
On Oct 11, 11:37 am, Olivier Lance <li...-fsXkhYbjdPsEEoCn2XhGlw@public.gmane.org> wrote:> I''ve tried to debug using ruby-debug, but couldn''t succeed in breaking > on TemplateError or NoMethodError exceptions.... > I''ve just spent hours on this, I really don''t get and don''t have a lot > of experience in dealing with that kind of issues... > I''d really appreciate if someone had an idea on how to fix this or at > least to track the bug down!Does still happen in production mode? If it doesn''t then you''ve got a class reloading issue. Fred> > By the way, I''m using Rails 2.3.8 with Ruby 1.8.7 > > Thanks a lot for reading this and for any help! > Olivier > Olivier > -- > Posted viahttp://www.ruby-forum.com/.-- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com. For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
Frederick Cheung wrote:> Does still happen in production mode? If it doesn''t then you''ve got a > class reloading issue. > > FredOh okay, thanks! That''s actually part of a feature currently in development so I haven''t tried it in production yet. I''ll try that and check that. I''ve just found an old topic where you mentioned this too, and it seems it''s the exact same problem (http://www.ruby-forum.com/topic/209224)... The ticket mentioned in this post by the OP was last updated one week ago, and it seems nothing''s been really settled yet... should I just set cache_classes=true ? ... Olivier -- Posted via http://www.ruby-forum.com/. -- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
On Oct 11, 1:30 pm, Olivier Lance <li...-fsXkhYbjdPsEEoCn2XhGlw@public.gmane.org> wrote:> Frederick Cheung wrote: > > Does still happen in production mode? If it doesn''t then you''ve got a > > class reloading issue. > > > Fred > > Oh okay, thanks! > That''s actually part of a feature currently in development so I haven''t > tried it in production yet. I''ll try that and check that. >Just setting cache_classes = true is enough for the purpose of this. You''re probably hitting this because you''re bypassing the rails code loading stuff. You might try using the constantize method provide by rails rather than rolling your own or (depending on the nature of the problem) you might want to mark some of the plugins you''re using as reloadable (most issues like this occur when a non reloading plugin ends up hanging on to reloadable bits of your app) Fred> I''ve just found an old topic where you mentioned this too, and it seems > it''s the exact same problem (http://www.ruby-forum.com/topic/209224)... > The ticket mentioned in this post by the OP was last updated one week > ago, and it seems nothing''s been really settled yet... should I just set > cache_classes=true ? ... > > Olivier > -- > Posted viahttp://www.ruby-forum.com/.-- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com. For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
Thanks Fred for this help! I can confirm now the problem was indeed a class reloading issue... My solution here was to move bookmark.rb out from acts_as_bookmarkable plugin directory to my models directory, just like it''s done with acts_as_commentable... doing so, the model is reloaded correctly without having to put any "trick" in place :) But thanks to you I''ve found many resources about this issue and several possible solutions, just in case I would stumble upon that again! so many thanks again :) Olivier -- Posted via http://www.ruby-forum.com/. -- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.