Background:
I followed the tutorial here to setup a polymorphic User favorites data model in my application. This allows me to let a User make pretty much any Entity in the system which I add ‘has_many :favorites, :as => :favorable‘ line to its model a favorite. I plan on using this to implement a Facebook style ‘Like’ system as well as several other similar systems.
To start off I added the favoritability to a Post model (each user can create status updates like on Facebook). I have it all done and unit tested so I know the data model is sound and functioning from either side of the relationship (User and Post).
Details:
-
I have a Home controller with a single index method and view.
-
on the index view I render out the posts for the user and the user’s friends
-
I want the user to be able to like posts from their friends
-
The Posts controller has only a create and a destroy method with associated routes (not a full fledged resource) and through the Post method via AJAX posts are created and deleted without issue
Where I am stuck
-
How do I add the link or button to add the post to the user’s Favorites?
-
According to the tutorial the way to create a new Favorite through the polymorphic association is to do it from the Post.favorites.build(:user_id => current_user.id). From this direction the build handles pulling out the Post’s ID and TYPE and all I have to do is pass in the user’s id
-
Do I use an AJAX form post to a Favorites controller with a Create and Destroy method similar to the Post controller?
-
I am still struggling to uncross the wires in my brain from ASP.Net N-Tier web application development over to Rails MVC. Hasn’t been too bad until now 😉
-
I bet there are Gems out there that might do this but I need to learn and the best way is to suffer through it. Maybe a tutorial or sample code from someone who has implemented liking functionality within their application would be helpful.
Thanks in advance for the assistance!
Jaap, I appreciate your comment on my question. After writing the question I pretty much didn’t want to wait because the real learning takes place through trial and error, so I errored it up 😉
It turns out that what you suggested was pretty much in line with exactly what I ended up doing myself (it’s always nice to find out that what you decide to do is what others would do as well, I love the sanity check value of it all).
So here is what I did and it is all working through post-backs. Now I just need to implement AJAX and style it:
My favorite model because my Polymorphic Favorites model requires that an Entity can only be favorited once by a user I added to the validations ‘Scopes’ which indicate that for each attribute it has to be unique in the scope of the other 2 required attributes. This solves the issue of multiple favorites by the same user.
My User Model (that which is relevant): I added 2 methods, the get_favorites which is the same as favorable one from the tutorial and a Favorite? method which checks to see if the Entity in question has already been added to the user’s favorites.
My Micropost Model (that which is relevant): note the Polymorphic association in the has_many relationship titled :favorites.
My Micropost Form: as you can see I am passing in the entity that will be mapped to the Favorite model as a local variable to the 2 Favorite forms as ‘local_entity’. This way I can pull out the ID and the TYPE of the Entity for the Polymorphic association.
My Make Favorite Form:
My Remove Favorite Form: