rateable 0.0.7

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in rateable.gemspec
4
+ gemspec
data/README.rdoc ADDED
@@ -0,0 +1,83 @@
1
+ = Rateable
2
+
3
+ This is my own simple way to add ajax voting to a rails application.
4
+
5
+ == Installation
6
+
7
+ Add the Gem to your Gemfile
8
+
9
+ gem "glynx_rateable"
10
+
11
+ Then install the Gem
12
+
13
+ bundle install
14
+
15
+ === Generating Files
16
+
17
+ After installing you should generate the needed files
18
+
19
+ rails generate rateable
20
+
21
+ === Migrating
22
+
23
+ Then apply the migration to your Database
24
+
25
+ rake db:migrate
26
+
27
+ === Includes
28
+
29
+ Add the "rateable.css" and "rateable.js" to the includes in your layout file
30
+
31
+ == Usage
32
+
33
+ === Model
34
+
35
+ Add to the user model that should be able to rate things:
36
+
37
+ class User < ActiveRecord::Base
38
+ is_rater
39
+ end
40
+
41
+ Add to the model that should be rateable
42
+
43
+ class Model < ActiveRecord::Base
44
+ is_rateable
45
+ end
46
+
47
+ === Controller
48
+
49
+ Add a rate action to the controller of the model that should be rateable, it should look like this:
50
+
51
+ def rate
52
+ # Check if the current user has already voted
53
+ if current_user and current_user.ratings.where(:rateable => @model).empty?
54
+ @model.rate(current_user, params[:stars])
55
+ render :partial => "rateable/rating", :locals => {:rating => @model.ratings.average("stars").to_i}
56
+ else
57
+ render :text => "You have already voted for this item!", :status => 500
58
+ end
59
+ end
60
+
61
+ === Routes
62
+
63
+ Add a post action called "rate" to the resource in your "config/routes.rb"
64
+
65
+ resource :models do
66
+ member do
67
+ post :rate
68
+ end
69
+ end
70
+
71
+ === Views
72
+
73
+ In your Views you can add the rating stars by adding:
74
+
75
+ <%= rating_for @model %>
76
+
77
+ You can also supply the url for the rate action manually, for example when using nested resources
78
+
79
+ <%= rating_for @model, :url => url_for([:rate, @category, @model]) %>
80
+
81
+ If there is no current_user method you can also supply your current user like this:
82
+
83
+ <%= rating_for @model, :user => @user %>
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
@@ -0,0 +1,17 @@
1
+ rate = (star) ->
2
+ url = star.data()["url"]
3
+ stars = star.data()["stars"]
4
+ $.ajax url,
5
+ type: "POST"
6
+ data:
7
+ stars : stars
8
+ dataType: "html"
9
+ error: (resp) ->
10
+ window.reload()
11
+ success: (resp) ->
12
+ star.parent().replaceWith(resp)
13
+
14
+ jQuery ->
15
+ $(".rating a").bind "click", (e) ->
16
+ rate $(this)
17
+ e.preventDefault()
@@ -0,0 +1,7 @@
1
+ <% url ||= [:rate, rateable] %>
2
+ <% stars ||= 5 %>
3
+ <div class="rating" style="width: <%= stars*32 %>px;">
4
+ <% stars.times do |i| %>
5
+ <a class="rate" href="#" data-stars="<%=i+1%>" data-url="<%= url %>" style="width:<%=(i+1)*32%>px; z-index: <%= stars - i%>;"></a>
6
+ <% end %>
7
+ </div>
@@ -0,0 +1,7 @@
1
+ <% stars ||= 5 %>
2
+ <% tooltip ||= nil %>
3
+ <div class="rating" style="width: <%=stars*32%>px;" <%= "title='#{tooltip}'" if tooltip %> >
4
+ <% stars.times do |i| %>
5
+ <%= image_tag (i < rating ? "rateable/star_filled.png" : "rateable/star_unfilled.png"), :style => "margin-left: #{i*32}px; z-index: #{stars - i}" %>
6
+ <% end %>
7
+ </div>
@@ -0,0 +1 @@
1
+ This generates all files nessesary for using the rateable gem, including the migration.
@@ -0,0 +1,23 @@
1
+ require 'rails/generators/migration'
2
+
3
+ class RateableGenerator < Rails::Generators::Base
4
+ include Rails::Generators::Migration
5
+
6
+ source_root File.expand_path('../templates', __FILE__)
7
+
8
+ def copy_files
9
+ copy_file "star_unfilled.png", "public/images/rateable/star_unfilled.png"
10
+ copy_file "star_filled.png", "public/images/rateable/star_filled.png"
11
+ copy_file "rateable.js", "public/javascripts/rateable.js"
12
+ copy_file "rateable.css", "public/stylesheets/rateable.css"
13
+ migration_template "migration.rb", "db/migrate/rateable_migration"
14
+ end
15
+
16
+ def self.next_migration_number(dirname)
17
+ if ActiveRecord::Base.timestamped_migrations
18
+ Time.now.utc.strftime("%Y%m%d%H%M%S")
19
+ else
20
+ "%.3d" % (current_migration_number(dirname) + 1)
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,15 @@
1
+ class RateableMigration < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :rates do |t|
4
+ t.integer 'rateable_id'
5
+ t.string 'rateable_type'
6
+ t.integer 'rater_id'
7
+ t.string 'rater_type'
8
+ t.integer 'stars'
9
+ end
10
+ end
11
+
12
+ def self.down
13
+ drop_table :rates
14
+ end
15
+ end
@@ -0,0 +1,22 @@
1
+ .rating {
2
+ position: relative;
3
+ height: 32px;
4
+ background: url(/images/rateable/star_unfilled.png) top left repeat-x;
5
+ }
6
+
7
+ .rating a {
8
+ position: absolute;
9
+ height: 32px;
10
+ text-decoration: none;
11
+ }
12
+
13
+ .rating img {
14
+ position: absolute;
15
+ width: 32px;
16
+ text-decoration: none;
17
+ }
18
+
19
+
20
+ .rating .rate:hover {
21
+ background: url(/images/rateable/star_filled.png) bottom left repeat-x;
22
+ }
@@ -0,0 +1,29 @@
1
+ /* DO NOT MODIFY. This file was compiled Fri, 05 Aug 2011 22:17:18 GMT from
2
+ * /home/andre/Dokumente/yvi/comics/app/coffeescripts/rateable.coffee
3
+ */
4
+
5
+ var rate;
6
+ rate = function(star) {
7
+ var stars, url;
8
+ url = star.data()["url"];
9
+ stars = star.data()["stars"];
10
+ return $.ajax(url, {
11
+ type: "POST",
12
+ data: {
13
+ stars: stars
14
+ },
15
+ dataType: "html",
16
+ error: function(resp) {
17
+ return window.reload();
18
+ },
19
+ success: function(resp) {
20
+ return star.parent().replaceWith(resp);
21
+ }
22
+ });
23
+ };
24
+ jQuery(function() {
25
+ return $(".rating a").bind("click", function(e) {
26
+ rate($(this));
27
+ return e.preventDefault();
28
+ });
29
+ });
@@ -0,0 +1,14 @@
1
+ module Rateable
2
+ module Helper
3
+ def rating_for(rateable, args = {})
4
+ user = args[:user] || try(:current_user)
5
+ if user and user.ratings.where(:rateable => rateable).empty?
6
+ render :partial => "rateable/rate", :locals => {:url => args[:url] ? args[:url] : url_for(rateable), :stars => args[:stars]}
7
+ else
8
+ stars_average = rateable.ratings.average("stars")
9
+ ratings_count = rateable.ratings.count
10
+ render :partial => "rateable/rating", :locals => {:stars => args[:stars], :rating => stars_average.to_i, :tooltip => "#{ratings_count} #{ratings_count == 1 ? "time" : "times"} rated, with an average value of #{stars_average}."}
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,33 @@
1
+ module Rateable
2
+ module IsRateable
3
+ def self.included(base)
4
+ base.extend ClassMethods
5
+ end
6
+
7
+ module ClassMethods
8
+ def is_rateable
9
+ has_many :ratings, :as => :rateable, :class_name => "Rateable::Rate", :dependent => :destroy
10
+ include Rateable::IsRateable::InstanceMethods
11
+ end
12
+
13
+ def is_rateable?
14
+ true
15
+ end
16
+ end
17
+
18
+ module InstanceMethods
19
+ def is_rateable?
20
+ true
21
+ end
22
+
23
+ # include instance methods that are needed
24
+ def rate(user,stars)
25
+ rating = Rate.where(:rateable => self, :rater => user).first
26
+ rating = Rate.create(:rateable => self, :rater => user) unless rating
27
+ rating.stars = stars
28
+ rating.save
29
+ end
30
+ end
31
+ end
32
+ end
33
+
@@ -0,0 +1,10 @@
1
+ module Rateable
2
+ class Rate < ActiveRecord::Base
3
+ belongs_to :rateable, :polymorphic => true
4
+ belongs_to :rater, :polymorphic => true
5
+
6
+ validates_presence_of :rateable
7
+ validates_presence_of :rater
8
+ validates_inclusion_of :stars, :in => (1..5).to_a
9
+ end
10
+ end
@@ -0,0 +1,32 @@
1
+ module Rateable
2
+ module Rater
3
+ def self.included(base)
4
+ base.extend ClassMethods
5
+ end
6
+
7
+ module ClassMethods
8
+ def is_rater
9
+ has_many :ratings, :as => :rater, :class_name => "Rateable::Rate", :dependent => :destroy
10
+ include Rateable::Rater::InstanceMethods
11
+ end
12
+
13
+ def is_rater?
14
+ true
15
+ end
16
+ end
17
+
18
+ module InstanceMethods
19
+ def is_rater?
20
+ true
21
+ end
22
+
23
+ def rate(obj,stars)
24
+ if obj.is_rateable?
25
+ obj.rate(self,stars)
26
+ else
27
+ false
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,3 @@
1
+ module Rateable
2
+ VERSION = "0.0.7"
3
+ end
data/lib/rateable.rb ADDED
@@ -0,0 +1,21 @@
1
+ require "active_record"
2
+ require "action_view"
3
+ require "action_controller"
4
+
5
+ require 'rateable/is_rateable'
6
+ require 'rateable/rater'
7
+ require 'rateable/rate'
8
+
9
+ if defined?(ActiveRecord::Base)
10
+ ActiveRecord::Base.send :include, Rateable::IsRateable
11
+ ActiveRecord::Base.send :include, Rateable::Rater
12
+ end
13
+
14
+ if defined?(ActionView::Base)
15
+ require 'rateable/helper'
16
+ ActionView::Base.send :include, Rateable::Helper
17
+ end
18
+
19
+ if defined?(ActionController::Base)
20
+ ActionController::Base.prepend_view_path File.dirname(__FILE__) + "/../app/views"
21
+ end
data/rateable.gemspec ADDED
@@ -0,0 +1,22 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "rateable/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "rateable"
7
+ s.version = Rateable::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ["André Domnick"]
10
+ s.email = ["andre@paniccrew.de"]
11
+ s.homepage = ""
12
+ s.summary = %q{Add a stars rating to your models}
13
+ s.description = %q{A way for simply adding an ajax rating to any of your models}
14
+
15
+ s.add_runtime_dependency 'rails', ">= 3.0.0"
16
+ s.add_runtime_dependency 'activerecord', ">= 3.0.0"
17
+
18
+ s.files = `git ls-files`.split("\n")
19
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
20
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
21
+ s.require_paths = ["lib"]
22
+ end
metadata ADDED
@@ -0,0 +1,117 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rateable
3
+ version: !ruby/object:Gem::Version
4
+ hash: 17
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 7
10
+ version: 0.0.7
11
+ platform: ruby
12
+ authors:
13
+ - "Andr\xC3\xA9 Domnick"
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2011-08-06 00:00:00 Z
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: rails
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ hash: 7
29
+ segments:
30
+ - 3
31
+ - 0
32
+ - 0
33
+ version: 3.0.0
34
+ type: :runtime
35
+ version_requirements: *id001
36
+ - !ruby/object:Gem::Dependency
37
+ name: activerecord
38
+ prerelease: false
39
+ requirement: &id002 !ruby/object:Gem::Requirement
40
+ none: false
41
+ requirements:
42
+ - - ">="
43
+ - !ruby/object:Gem::Version
44
+ hash: 7
45
+ segments:
46
+ - 3
47
+ - 0
48
+ - 0
49
+ version: 3.0.0
50
+ type: :runtime
51
+ version_requirements: *id002
52
+ description: A way for simply adding an ajax rating to any of your models
53
+ email:
54
+ - andre@paniccrew.de
55
+ executables: []
56
+
57
+ extensions: []
58
+
59
+ extra_rdoc_files: []
60
+
61
+ files:
62
+ - .gitignore
63
+ - Gemfile
64
+ - README.rdoc
65
+ - Rakefile
66
+ - app/coffeescripts/rateable.coffee
67
+ - app/views/rateable/_rate.erb
68
+ - app/views/rateable/_rating.erb
69
+ - lib/generators/rateable/USAGE
70
+ - lib/generators/rateable/rateable_generator.rb
71
+ - lib/generators/rateable/templates/migration.rb
72
+ - lib/generators/rateable/templates/rateable.css
73
+ - lib/generators/rateable/templates/rateable.js
74
+ - lib/generators/rateable/templates/star_filled.png
75
+ - lib/generators/rateable/templates/star_unfilled.png
76
+ - lib/rateable.rb
77
+ - lib/rateable/helper.rb
78
+ - lib/rateable/is_rateable.rb
79
+ - lib/rateable/rate.rb
80
+ - lib/rateable/rater.rb
81
+ - lib/rateable/version.rb
82
+ - rateable.gemspec
83
+ homepage: ""
84
+ licenses: []
85
+
86
+ post_install_message:
87
+ rdoc_options: []
88
+
89
+ require_paths:
90
+ - lib
91
+ required_ruby_version: !ruby/object:Gem::Requirement
92
+ none: false
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ hash: 3
97
+ segments:
98
+ - 0
99
+ version: "0"
100
+ required_rubygems_version: !ruby/object:Gem::Requirement
101
+ none: false
102
+ requirements:
103
+ - - ">="
104
+ - !ruby/object:Gem::Version
105
+ hash: 3
106
+ segments:
107
+ - 0
108
+ version: "0"
109
+ requirements: []
110
+
111
+ rubyforge_project:
112
+ rubygems_version: 1.8.7
113
+ signing_key:
114
+ specification_version: 3
115
+ summary: Add a stars rating to your models
116
+ test_files: []
117
+