Rateable
This is my own simple way to add ajax voting to a rails application.
Installation
Add the Gem to your Gemfile
gem "glynx_rateable"
Then install the Gem
bundle install
Generating Files
After installing you should generate the needed files
rails generate rateable
Migrating
Then apply the migration to your Database
rake db:migrate
Includes
Add the “rateable.css” and “rateable.js” to the includes in your layout file
Usage
Model
Add to the user model that should be able to rate things:
class User < ActiveRecord::Base
is_rater
end
Add to the model that should be rateable
class Model < ActiveRecord::Base
is_rateable
end
Controller
Add a rate action to the controller of the model that should be rateable, it should look like this:
def rate
# Check if the current user has already voted
if current_user and current_user..where(:rateable => @model).empty?
@model.rate(current_user, params[:stars])
render :partial => "rateable/rating", :locals => {:rating => @model..average("stars").to_i}
else
render :text => "You have already voted for this item!", :status => 500
end
end
Routes
Add a post action called “rate” to the resource in your “config/routes.rb”
resources :models do
member do
post :rate
end
end
Views
In your Views you can add the rating stars by adding:
<%= rating_for @model %>
You can also supply the url for the rate action manually, for example when using nested resources
<%= rating_for @model, :url => url_for([:rate, @category, @model]) %>
If there is no current_user method you can also supply your current user like this:
<%= rating_for @model, :user => @user %>