winston
winston

Reputation: 3100

Show value of activity.trackable with public_activity Rails gem

I'm using the public_activity gem to track changes with my Reposts model, which contains a comment_id and belongs_to the Comments table. In the _create.html.erb partial for the create action of a Repost, I can use this code with no errors:

<%= activity.trackable.comment %>

and the view will display this text:

Comment:0x00000004508ee0>

Which proves that it's displaying the Activerecord using the relationship I established between Reposts and Comments. However, once I try to extend the code to show the content field on the Comments table I get an error. For example:

<%= activity.trackable.comment.content %> 

Returns the following error:

undefined method 'content' for nil:NilClass

activity.trackable.comment seems to pull the right record. How can I extend this so not only does it pull the record via the established relationship, but that it also pulls another field from that table?

Thanks!

EDIT 1: Full view for views/public_activity/_create.html.erb

<% if activity.trackable %>
  <%= link_to activity.trackable.comment, activity.trackable.comment %>
  <% else %>
  which has since been removed
<% end %>

EDIT 2: Per Leo's assistance, all I had to do was check for nil. Here's what I had to change my code to:

<% if activity.trackable && activity.trackable.comment.present? %>
 <%= link_to activity.trackable.comment.content, activity.trackable.comment %>
  <% else %>
  which has since been removed
<% end %>

I highly recommend adding that additional code to check for nil if you followed along the public_activity Railscast like I did.

Upvotes: 1

Views: 1137

Answers (2)

Leo Correa
Leo Correa

Reputation: 19839

So it seems per this particular question, the activity.trackable.comment was returning a NilClass object for some activities causing the exception to be thrown.

The fix of course is to check to make sure comment is not nil by doing the following

<% if activity.trackable && activity.trackable.comment.present? %>
 <%= link_to activity.trackable.comment.content, activity.trackable.comment %>
  <% else %>
  which has since been removed
<% end %>

Upvotes: 1

t56k
t56k

Reputation: 7011

It seems like you're accessing the wrong object to get a count from. I've used the impressionist_count method for this sort of task in the past, the documentation here might help you.

Upvotes: 0

Related Questions