public
Description: Ratings for your model.
Homepage: http://zachinglis.com
Clone URL: git://github.com/zachinglis/is_rateable.git
Click here to lend your support to: is_rateable and make a donation at www.pledgie.com !
name age message
file MIT-LICENSE Thu Jul 17 08:50:36 -0700 2008 initial commit [zachinglis]
file README.textile Wed Jun 10 05:53:25 -0700 2009 Fixing some bugs in README [zachinglis]
file Rakefile Thu Jul 17 08:50:36 -0700 2008 initial commit [zachinglis]
directory generators/ Tue Jun 09 13:28:31 -0700 2009 Including spinner.gif Signed-off-by: Zach Ingl... [Mateus Linhares]
file init.rb Thu Jul 17 11:02:00 -0700 2008 Started work on the view helpers [zachinglis]
file install.rb Thu Jul 17 08:50:36 -0700 2008 initial commit [zachinglis]
directory lib/ Tue Jun 09 13:28:32 -0700 2009 Refactoring is_rateable Signed-off-by: Zach In... [Mateus Linhares]
directory tasks/ Thu Jul 17 08:50:36 -0700 2008 initial commit [zachinglis]
directory test/ Thu Jul 17 08:50:36 -0700 2008 initial commit [zachinglis]
file uninstall.rb Thu Jul 17 08:50:36 -0700 2008 initial commit [zachinglis]

is_rateable

Currently star buttons are a put request, not a post request like they should be due to time constraints. Should be fixed in a future version.

Patches welcome! I do test my own stuff but until I find a nice and easy way to include rspec in plugins, they won’t come with the specs.

Usage

To install, type script/generate rateable [--by_user]

Options

—by-user will associate your ratings to a user model. Hopefully you’ve got one already.

h4. Without Ajax In your model.
    is_rateable :upto => 5 # it defaults :upto => 5
  
In your view.
    render_rating(@book, :interactive_stars)
    render_rating(@book) # If you want to also see 1/5 Stars
  

If a user rates more than twice, it will delete their older rating and put up a new rating.

Add a method to your books_controller like so:
    def rate
      @book = Book.find(params[:id])
      unless @book.add_rating(params[:rating].to_i, :ip => request.remote_ip)
        flash[:notice] = "You have already voted on this book" 
      end
      redirect_to @book
    end
  

Using Ajax

You can use the same code for your model
    is_rateable :upto => 5 # it defaults :upto => 5
  
On your view, you need to call a partial
    #Using html.erb
      <div id="rating">
        <%= render :partial => "books/rate", :locals => { :rateable => @book } %>
      </div>

    #Using haml 
      #rating
        render :partial => "books/rate", :locals => { :rateable => @book }
  
Your partial will have a spinner and a div to be replaced when ajax is completed
    #Using html.erb (views/books/_rate.html.erb)
      <%= render_ajax_rating rateable %>
      <%= image_tag "icons/spinner.gif", :id => :spinner, :style => "display: none;" %>
      <div id="success_rating" style="display:none;">
        Rated!
      </div>

    #Using haml (views/books/_rate.html.haml)

      = render_ajax_rating rateable
      = image_tag "icons/spinner.gif", :id => :spinner, :style => "display: none;" 
      #success_rating{:style => "display:none;"}
        Rated!
  
On your controller:
    def rate
        @book = Book.find(params[:id])
        @book.rate params[:rating].to_i
        render :update do |page|
          page.replace_html("rating", {:partial => "rate", :locals => {:rateable => @book}})
          page.show "success_rating" 
        end
    end
  

Todo

  • Annotate methods

Credits

Ajax Rating

Copyright© 2008 Zach Inglis, released under the MIT license