ajaxful_rating 2.2.9.1 → 3.0.0.beta1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +4 -0
- data/CHANGELOG +0 -18
- data/ChangeLog +33 -0
- data/Manifest +0 -1
- data/README.textile +2 -5
- data/Rakefile +17 -10
- data/ajaxful_rating.gemspec +60 -15
- data/lib/axr/helpers.rb +7 -7
- data/lib/axr/locale.rb +6 -8
- data/lib/axr/model.rb +33 -48
- data/lib/axr/stars_builder.rb +22 -28
- data/{generators → lib/generators}/ajaxful_rating/USAGE +1 -1
- data/lib/generators/ajaxful_rating/ajaxful_rating_generator.rb +38 -0
- data/{generators → lib/generators}/ajaxful_rating/templates/images/star.png +0 -0
- data/{generators → lib/generators}/ajaxful_rating/templates/images/star_small.png +0 -0
- data/{generators → lib/generators}/ajaxful_rating/templates/migration.rb +1 -1
- data/{generators → lib/generators}/ajaxful_rating/templates/model.rb +0 -0
- data/{generators → lib/generators}/ajaxful_rating/templates/style.css +0 -0
- data/test/fixtures/car.rb +3 -0
- data/test/fixtures/cars.yml +7 -0
- data/test/fixtures/rate.rb +6 -0
- data/test/fixtures/rates.yml +41 -0
- data/test/fixtures/schema.rb +22 -0
- data/test/fixtures/user.rb +3 -0
- data/test/fixtures/users.yml +7 -0
- data/test/lib/model_test.rb +58 -0
- data/test/test_helper.rb +25 -0
- metadata +46 -42
- data/generators/ajaxful_rating/ajaxful_rating_generator.rb +0 -30
- data/init.rb +0 -6
data/.gitignore
ADDED
data/CHANGELOG
CHANGED
@@ -1,21 +1,3 @@
|
|
1
|
-
== 2.2.8.1 Jul 02, 2010
|
2
|
-
* Call html_safe only when it's available.
|
3
|
-
|
4
|
-
== 2.2.8 Jun 14, 2010
|
5
|
-
* Fix html for <li> marking it as html_safe when using rails_xss plugin
|
6
|
-
|
7
|
-
== 2.2.7 Jun 12, 2010
|
8
|
-
* Fix generated html marking it as html_safe when using rails_xss plugin
|
9
|
-
|
10
|
-
== 2.2.6 May 27, 2010
|
11
|
-
* Fix wrapper_dom_id with false values for keys
|
12
|
-
|
13
|
-
== 2.2.5 May 21, 2010
|
14
|
-
* Fix wrapper_dom_id with empty values
|
15
|
-
|
16
|
-
== 2.2.4 April 15, 2010
|
17
|
-
* Fix wrapper_dom_id join options
|
18
|
-
|
19
1
|
== 2.2.3 March 10, 2010
|
20
2
|
* Fix validation of current_user to show linked stars
|
21
3
|
|
data/ChangeLog
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
== 2.2.3 March 10, 2010
|
2
|
+
* Fix validation of current_user to show linked stars
|
3
|
+
|
4
|
+
== 2.2.2 March 9, 2010
|
5
|
+
* Fix bug for jRuby
|
6
|
+
* Fixed user self relational model to be rater and rateable.
|
7
|
+
|
8
|
+
== 2.2.1 March 8, 2010
|
9
|
+
* Changed :force_dynamic for its opposite :force_static.
|
10
|
+
* Fixed I18n texts.
|
11
|
+
* Fixed missed quotes for Rate belongs_to association with User class
|
12
|
+
* Detailed wrapper DOM id with passed hash.
|
13
|
+
|
14
|
+
== 2.2.0 March 7, 2010
|
15
|
+
* Improved model methods and options.
|
16
|
+
* Works now with inherited models.
|
17
|
+
* Removed HTML and CSS options for helper for sake of simpleness.
|
18
|
+
* Renamed helper option :small_stars to :small.
|
19
|
+
* Changed whole helper approach. It should work the same as before.
|
20
|
+
(Except for the renamed and removed options)
|
21
|
+
* Removed :force_dynamic, you should exclude the helper from cache since it uses
|
22
|
+
authorization.
|
23
|
+
* Fixed opened bugs so far.
|
24
|
+
|
25
|
+
== 2.1.5 January 28, 2010
|
26
|
+
* Renamed options method name to avoid collapse.
|
27
|
+
* Removed CSS duplication.
|
28
|
+
|
29
|
+
== 2.1.4 January 25, 2010
|
30
|
+
* Added option for showing current_user's rate instead of global average
|
31
|
+
|
32
|
+
== 2.1.0 July 25, 2009
|
33
|
+
* AjaxfulRating is now available as a gem
|
data/Manifest
CHANGED
data/README.textile
CHANGED
@@ -64,7 +64,8 @@ class Car < ActiveRecord::Base
|
|
64
64
|
end
|
65
65
|
</pre>
|
66
66
|
|
67
|
-
Then you need to add a call @ajaxful_rater@ in the user model
|
67
|
+
Then you need to add a call @ajaxful_rater@ in the user model. This includes a simple line so
|
68
|
+
you can add it _by your own_ as well (@has_many :rates@).
|
68
69
|
|
69
70
|
<pre>
|
70
71
|
class User < ActiveRecord::Base
|
@@ -121,13 +122,9 @@ correct action in your controller:
|
|
121
122
|
<%= ratings_for @article, :remote_options => {:url => your_rate_path(@article)} %>
|
122
123
|
</pre>
|
123
124
|
|
124
|
-
h3. Important!
|
125
|
-
|
126
125
|
*To display the stars properly you need to add a call in the head of your layout, which will generate the
|
127
126
|
required CSS style for the list. Also don't forget to include the javascripts.*
|
128
127
|
|
129
|
-
It's also important to note that this call MUST be within your head tags in your layout, as for now it seems to doesn't work with the @content_for@ tag.
|
130
|
-
|
131
128
|
<pre>
|
132
129
|
#within the head tags of your layout...
|
133
130
|
<%= javascript_include_tag :defaults %>
|
data/Rakefile
CHANGED
@@ -1,14 +1,21 @@
|
|
1
1
|
require 'rubygems'
|
2
2
|
require 'rake'
|
3
|
-
require 'echoe'
|
4
3
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
4
|
+
begin
|
5
|
+
require 'jeweler'
|
6
|
+
|
7
|
+
Jeweler::Tasks.new do |spec|
|
8
|
+
spec.name = "ajaxful_rating"
|
9
|
+
spec.version = "3.0.0.beta1"
|
10
|
+
spec.summary = "Provides a simple way to add rating functionality to your application."
|
11
|
+
spec.description = "Provides a simple way to add rating functionality to your application."
|
12
|
+
spec.homepage = "http://github.com/edgarjs/ajaxful-rating"
|
13
|
+
spec.authors = ["Edgar J. Suarez", "Denis Odorcic"]
|
14
|
+
spec.email = ["edgar.js@gmail.com", "denis.odorcic@gmail.com"]
|
15
|
+
spec.has_rdoc = true
|
16
|
+
spec.files.exclude 'init.rb'
|
17
|
+
end
|
18
|
+
|
19
|
+
rescue LoadError
|
20
|
+
puts "Jeweler not available. Install it with: gem install jeweler"
|
12
21
|
end
|
13
|
-
|
14
|
-
Dir["#{File.dirname(__FILE__)}/tasks/*.rake"].sort.each { |ext| load ext }
|
data/ajaxful_rating.gemspec
CHANGED
@@ -1,29 +1,74 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
1
4
|
# -*- encoding: utf-8 -*-
|
2
5
|
|
3
6
|
Gem::Specification.new do |s|
|
4
|
-
s.name =
|
5
|
-
s.version = "
|
7
|
+
s.name = %q{ajaxful_rating}
|
8
|
+
s.version = "3.0.0.beta1"
|
6
9
|
|
7
|
-
s.required_rubygems_version = Gem::Requirement.new("
|
8
|
-
s.authors = ["Edgar J. Suarez"]
|
9
|
-
s.date =
|
10
|
-
s.description =
|
11
|
-
s.email = "edgar.js@gmail.com"
|
12
|
-
s.extra_rdoc_files = [
|
13
|
-
|
14
|
-
|
15
|
-
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Edgar J. Suarez", "Denis Odorcic"]
|
12
|
+
s.date = %q{2010-05-03}
|
13
|
+
s.description = %q{Provides a simple way to add rating functionality to your application.}
|
14
|
+
s.email = ["edgar.js@gmail.com", "denis.odorcic@gmail.com"]
|
15
|
+
s.extra_rdoc_files = [
|
16
|
+
"ChangeLog",
|
17
|
+
"README.textile"
|
18
|
+
]
|
19
|
+
s.files = [
|
20
|
+
".gitignore",
|
21
|
+
"CHANGELOG",
|
22
|
+
"Manifest",
|
23
|
+
"README.textile",
|
24
|
+
"Rakefile",
|
25
|
+
"ajaxful_rating.gemspec",
|
26
|
+
"lib/ajaxful_rating.rb",
|
27
|
+
"lib/axr/css_builder.rb",
|
28
|
+
"lib/axr/errors.rb",
|
29
|
+
"lib/axr/helpers.rb",
|
30
|
+
"lib/axr/locale.rb",
|
31
|
+
"lib/axr/model.rb",
|
32
|
+
"lib/axr/stars_builder.rb",
|
33
|
+
"lib/generators/ajaxful_rating/USAGE",
|
34
|
+
"lib/generators/ajaxful_rating/ajaxful_rating_generator.rb",
|
35
|
+
"lib/generators/ajaxful_rating/templates/images/star.png",
|
36
|
+
"lib/generators/ajaxful_rating/templates/images/star_small.png",
|
37
|
+
"lib/generators/ajaxful_rating/templates/migration.rb",
|
38
|
+
"lib/generators/ajaxful_rating/templates/model.rb",
|
39
|
+
"lib/generators/ajaxful_rating/templates/style.css",
|
40
|
+
"test/fixtures/car.rb",
|
41
|
+
"test/fixtures/cars.yml",
|
42
|
+
"test/fixtures/rate.rb",
|
43
|
+
"test/fixtures/rates.yml",
|
44
|
+
"test/fixtures/schema.rb",
|
45
|
+
"test/fixtures/user.rb",
|
46
|
+
"test/fixtures/users.yml",
|
47
|
+
"test/lib/model_test.rb",
|
48
|
+
"test/test_helper.rb"
|
49
|
+
]
|
50
|
+
s.homepage = %q{http://github.com/edgarjs/ajaxful-rating}
|
51
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
16
52
|
s.require_paths = ["lib"]
|
17
|
-
s.
|
18
|
-
s.
|
19
|
-
s.
|
53
|
+
s.rubygems_version = %q{1.3.6}
|
54
|
+
s.summary = %q{Provides a simple way to add rating functionality to your application.}
|
55
|
+
s.test_files = [
|
56
|
+
"test/fixtures/car.rb",
|
57
|
+
"test/fixtures/rate.rb",
|
58
|
+
"test/fixtures/schema.rb",
|
59
|
+
"test/fixtures/user.rb",
|
60
|
+
"test/lib/model_test.rb",
|
61
|
+
"test/test_helper.rb"
|
62
|
+
]
|
20
63
|
|
21
64
|
if s.respond_to? :specification_version then
|
65
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
22
66
|
s.specification_version = 3
|
23
67
|
|
24
|
-
if Gem::Version.new(Gem::
|
68
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
25
69
|
else
|
26
70
|
end
|
27
71
|
else
|
28
72
|
end
|
29
73
|
end
|
74
|
+
|
data/lib/axr/helpers.rb
CHANGED
@@ -20,7 +20,6 @@ module AjaxfulRating # :nodoc:
|
|
20
20
|
# * <tt>:show_user_rating</tt> Set to true if you want to display only the current user's rating, instead of the global average.
|
21
21
|
# * <tt>:dimension</tt> The dimension to show the ratings for.
|
22
22
|
# * <tt>:force_static</tt> Force static stars even when you're passing a user instance.
|
23
|
-
# * <tt>:to_nearest</tt> Allow stars to be set and averaged to nearest whatever. eg. 0.5 for the nearest half-star
|
24
23
|
#
|
25
24
|
# Example:
|
26
25
|
# <%= ratings_for @article, :wrap => false %> # => Will produce something like:
|
@@ -70,16 +69,17 @@ module AjaxfulRating # :nodoc:
|
|
70
69
|
#
|
71
70
|
# ajaxful_rating:
|
72
71
|
# helper:
|
73
|
-
# global_average: "Global rating average:
|
74
|
-
# user_rating: "Your rating:
|
75
|
-
# hover: "Rate
|
72
|
+
# global_average: "Global rating average: {{value}} out of {{max}}"
|
73
|
+
# user_rating: "Your rating: {{value}} out of {{max}}"
|
74
|
+
# hover: "Rate {{value}} out of {{max}}" def ratings_for(*args)
|
76
75
|
def ratings_for(*args)
|
77
76
|
@axr_css ||= CSSBuilder.new
|
78
|
-
options = args.extract_options!.symbolize_keys.slice(:small, :remote_options,
|
79
|
-
:wrap, :show_user_rating, :dimension, :force_static, :current_user
|
77
|
+
options = args.extract_options!.to_hash.symbolize_keys.slice(:small, :remote_options,
|
78
|
+
:wrap, :show_user_rating, :dimension, :force_static, :current_user)
|
79
|
+
|
80
80
|
remote_options = options.delete(:remote_options) || {}
|
81
81
|
rateable = args.shift
|
82
|
-
user = args.shift || (respond_to?(:current_user) ? current_user : raise(NoUserSpecified))
|
82
|
+
user = args.shift || (respond_to?(:current_user) ? current_user : raise(Errors::NoUserSpecified))
|
83
83
|
StarsBuilder.new(rateable, user, self, @axr_css, options, remote_options).render
|
84
84
|
end
|
85
85
|
end
|
data/lib/axr/locale.rb
CHANGED
@@ -4,16 +4,15 @@ module AjaxfulRating # :nodoc:
|
|
4
4
|
#
|
5
5
|
# ajaxful_rating:
|
6
6
|
# helper:
|
7
|
-
# global_average: "Global rating average:
|
8
|
-
# user_rating: "Your rating:
|
9
|
-
# hover: "Rate
|
7
|
+
# global_average: "Global rating average: {{value}} out of {{max}}"
|
8
|
+
# user_rating: "Your rating: {{value}} out of {{max}}"
|
9
|
+
# hover: "Rate {{value}} out of {{max}}"
|
10
10
|
module Locale
|
11
11
|
|
12
12
|
DEFAULTS = {
|
13
|
-
:user_rating => "Your rating:
|
14
|
-
:global_average => "Global rating average:
|
15
|
-
:hover => "Rate
|
16
|
-
:no_ratings => "Not yet rated"
|
13
|
+
:user_rating => "Your rating: {{value}} out of {{max}}",
|
14
|
+
:global_average => "Global rating average: {{value}} out of {{max}}",
|
15
|
+
:hover => "Rate {{value}} out of {{max}}"
|
17
16
|
}
|
18
17
|
|
19
18
|
def i18n(key, value = nil)
|
@@ -22,7 +21,6 @@ module AjaxfulRating # :nodoc:
|
|
22
21
|
else
|
23
22
|
key.to_sym
|
24
23
|
end
|
25
|
-
key = :no_ratings if key == :user_rating && options[:show_user_rating] && ((value || show_value) == 0)
|
26
24
|
default = DEFAULTS[key]
|
27
25
|
key = "ajaxful_rating.helper.#{key}"
|
28
26
|
I18n.t(key, :value => (value || show_value),
|
data/lib/axr/model.rb
CHANGED
@@ -12,18 +12,16 @@ module AjaxfulRating # :nodoc:
|
|
12
12
|
# * <tt>:stars</tt> Max number of stars that can be submitted.
|
13
13
|
# * <tt>:allow_update</tt> Set to true if you want users to be able to update their votes.
|
14
14
|
# * <tt>:cache_column</tt> Name of the column for storing the cached rating average.
|
15
|
-
# * <tt>:cache_column</tt> Name of the column for storing the cached rating average.
|
16
|
-
# * <tt>:to_nearest</tt> Allow stars to be set and averaged to nearest whatever . eg. 0.5 for the nearest half-star. May be overridden in the ratings_for
|
17
15
|
#
|
18
16
|
# Example:
|
19
17
|
# class Article < ActiveRecord::Base
|
20
18
|
# ajaxful_rateable :stars => 10, :cache_column => :custom_column
|
21
19
|
# end
|
22
20
|
def ajaxful_rateable(options = {})
|
23
|
-
has_many :rates_without_dimension, :as => :rateable,
|
21
|
+
has_many :rates_without_dimension, :as => :rateable, :class_name => 'Rate',
|
24
22
|
:dependent => :destroy, :conditions => {:dimension => nil}
|
25
23
|
has_many :raters_without_dimension, :through => :rates_without_dimension, :source => :rater
|
26
|
-
|
24
|
+
|
27
25
|
options[:dimensions].each do |dimension|
|
28
26
|
has_many "#{dimension}_rates", :dependent => :destroy,
|
29
27
|
:conditions => {:dimension => dimension.to_s}, :class_name => 'Rate', :as => :rateable
|
@@ -38,12 +36,12 @@ module AjaxfulRating # :nodoc:
|
|
38
36
|
:cache_column => :rating_average
|
39
37
|
}
|
40
38
|
end
|
41
|
-
|
39
|
+
|
42
40
|
alias_method :ajaxful_rating_options, :axr_config
|
43
41
|
end
|
44
|
-
|
42
|
+
|
45
43
|
axr_config.update(options)
|
46
|
-
|
44
|
+
|
47
45
|
include AjaxfulRating::InstanceMethods
|
48
46
|
extend AjaxfulRating::SingletonMethods
|
49
47
|
end
|
@@ -56,7 +54,7 @@ module AjaxfulRating # :nodoc:
|
|
56
54
|
|
57
55
|
# Instance methods for the rateable object.
|
58
56
|
module InstanceMethods
|
59
|
-
|
57
|
+
|
60
58
|
# Proxy for axr_config singleton method.
|
61
59
|
def axr_config
|
62
60
|
self.class.axr_config
|
@@ -73,7 +71,7 @@ module AjaxfulRating # :nodoc:
|
|
73
71
|
# end
|
74
72
|
def rate(stars, user, dimension = nil)
|
75
73
|
return false if (stars.to_i > self.class.max_stars)
|
76
|
-
raise AlreadyRatedError if (!self.class.axr_config[:allow_update] && rated_by?(user, dimension))
|
74
|
+
raise Errors::AlreadyRatedError if (!self.class.axr_config[:allow_update] && rated_by?(user, dimension))
|
77
75
|
|
78
76
|
rate = if self.class.axr_config[:allow_update] && rated_by?(user, dimension)
|
79
77
|
rate_by(user, dimension)
|
@@ -86,19 +84,21 @@ module AjaxfulRating # :nodoc:
|
|
86
84
|
rate.save!
|
87
85
|
self.update_cached_average(dimension)
|
88
86
|
end
|
89
|
-
|
87
|
+
|
90
88
|
# Builds the DOM id attribute for the wrapper in view.
|
91
89
|
def wrapper_dom_id(options = {})
|
92
|
-
options = options.symbolize_keys.slice(:small, :dimension)
|
93
|
-
options = options.
|
90
|
+
options = options.to_hash.symbolize_keys.slice(:small, :dimension)
|
91
|
+
options = options.map do |k, v|
|
94
92
|
if k == :dimension
|
95
93
|
v.to_s
|
96
94
|
else
|
97
95
|
v.to_s == 'true' ? k.to_s : "no-#{k}"
|
98
96
|
end
|
99
97
|
end
|
100
|
-
options.
|
101
|
-
|
98
|
+
options = options.delete_if { |x| x.empty? }
|
99
|
+
prefix = "ajaxful_rating"
|
100
|
+
prefix << "_#{options.sort.join('_')}" unless options.empty?
|
101
|
+
ApplicationController.helpers.dom_id(self, prefix)
|
102
102
|
end
|
103
103
|
|
104
104
|
# Returns an array with the users that have rated this object for the
|
@@ -108,13 +108,13 @@ module AjaxfulRating # :nodoc:
|
|
108
108
|
def raters(dimension = nil)
|
109
109
|
sql = "SELECT DISTINCT u.* FROM #{self.class.user_class.table_name} u "\
|
110
110
|
"INNER JOIN rates r ON u.id = r.rater_id WHERE "
|
111
|
-
|
111
|
+
|
112
112
|
sql << self.class.send(:sanitize_sql_for_conditions, {
|
113
113
|
:rateable_id => id,
|
114
114
|
:rateable_type => self.class.base_class.name,
|
115
115
|
:dimension => (dimension.to_s if dimension)
|
116
116
|
}, 'r')
|
117
|
-
|
117
|
+
|
118
118
|
self.class.user_class.find_by_sql(sql)
|
119
119
|
end
|
120
120
|
|
@@ -127,7 +127,7 @@ module AjaxfulRating # :nodoc:
|
|
127
127
|
def rated_by?(user, dimension = nil)
|
128
128
|
!rate_by(user, dimension).nil?
|
129
129
|
end
|
130
|
-
|
130
|
+
|
131
131
|
# Returns whether or not the user can rate this object.
|
132
132
|
# Based on if the user has already rated the object or the
|
133
133
|
# :allow_update option is enabled.
|
@@ -148,20 +148,11 @@ module AjaxfulRating # :nodoc:
|
|
148
148
|
# Rating average for the object.
|
149
149
|
#
|
150
150
|
# Pass false as param to force the calculation if you are caching it.
|
151
|
-
def rate_average(cached = true, dimension = nil
|
152
|
-
avg = if cached && self.class.caching_average?(dimension
|
153
|
-
send(caching_column_name(dimension
|
151
|
+
def rate_average(cached = true, dimension = nil)
|
152
|
+
avg = if cached && self.class.caching_average?(dimension)
|
153
|
+
send(caching_column_name(dimension)).to_f
|
154
154
|
else
|
155
|
-
|
156
|
-
avg.nan? ? 0.0 : avg
|
157
|
-
if avg > 0
|
158
|
-
to_nearest ||= axr_config[:to_nearest]
|
159
|
-
if to_nearest
|
160
|
-
notches = 1/to_nearest.to_f
|
161
|
-
avg = ((avg * notches).round)/notches
|
162
|
-
end
|
163
|
-
end
|
164
|
-
avg
|
155
|
+
self.rates_sum(dimension).to_f / self.total_rates(dimension).to_f
|
165
156
|
end
|
166
157
|
avg.nan? ? 0.0 : avg
|
167
158
|
end
|
@@ -179,20 +170,20 @@ module AjaxfulRating # :nodoc:
|
|
179
170
|
end
|
180
171
|
|
181
172
|
# Returns the name of the cache column for the passed dimension.
|
182
|
-
def caching_column_name(dimension = nil
|
183
|
-
self.class.caching_column_name(dimension
|
173
|
+
def caching_column_name(dimension = nil)
|
174
|
+
self.class.caching_column_name(dimension)
|
184
175
|
end
|
185
176
|
|
186
177
|
# Updates the cached average column in the rateable model.
|
187
|
-
def update_cached_average(dimension = nil
|
188
|
-
if self.class.caching_average?(dimension
|
189
|
-
update_attribute caching_column_name(dimension
|
178
|
+
def update_cached_average(dimension = nil)
|
179
|
+
if self.class.caching_average?(dimension)
|
180
|
+
update_attribute caching_column_name(dimension), self.rate_average(false, dimension)
|
190
181
|
end
|
191
182
|
end
|
192
183
|
end
|
193
184
|
|
194
185
|
module SingletonMethods
|
195
|
-
|
186
|
+
|
196
187
|
# Maximum value accepted when rating the model. Default is 5.
|
197
188
|
#
|
198
189
|
# Change it by passing the :stars option to +ajaxful_rateable+
|
@@ -202,16 +193,11 @@ module AjaxfulRating # :nodoc:
|
|
202
193
|
axr_config[:stars]
|
203
194
|
end
|
204
195
|
|
205
|
-
# Allow stars to be set and averaged to nearest whatever. eg. 0.5 for the nearest half-star
|
206
|
-
def to_nearest
|
207
|
-
axr_config[:to_nearest] || 1
|
208
|
-
end
|
209
|
-
|
210
196
|
# Name of the class for the user model.
|
211
197
|
def user_class_name
|
212
198
|
Rate.reflect_on_association(:rater).options[:class_name]
|
213
199
|
end
|
214
|
-
|
200
|
+
|
215
201
|
# Gets the user's class
|
216
202
|
def user_class
|
217
203
|
user_class_name.constantize
|
@@ -241,13 +227,13 @@ module AjaxfulRating # :nodoc:
|
|
241
227
|
def find_statement(attr_name, attr_value, dimension = nil)
|
242
228
|
sql = "SELECT DISTINCT r2.* FROM rates r1 INNER JOIN "\
|
243
229
|
"#{self.base_class.table_name} r2 ON r1.rateable_id = r2.id WHERE "
|
244
|
-
|
230
|
+
|
245
231
|
sql << sanitize_sql_for_conditions({
|
246
232
|
:rateable_type => self.base_class.name,
|
247
233
|
attr_name => attr_value,
|
248
234
|
:dimension => (dimension.to_s if dimension)
|
249
235
|
}, 'r1')
|
250
|
-
|
236
|
+
|
251
237
|
find_by_sql(sql)
|
252
238
|
end
|
253
239
|
|
@@ -262,15 +248,14 @@ module AjaxfulRating # :nodoc:
|
|
262
248
|
#
|
263
249
|
# ajaxful_rateable :cache_column => :my_custom_column
|
264
250
|
#
|
265
|
-
def caching_average?(dimension = nil
|
266
|
-
column_names.include?(caching_column_name(dimension
|
251
|
+
def caching_average?(dimension = nil)
|
252
|
+
column_names.include?(caching_column_name(dimension))
|
267
253
|
end
|
268
254
|
|
269
255
|
# Returns the name of the cache column for the passed dimension.
|
270
|
-
def caching_column_name(dimension = nil
|
256
|
+
def caching_column_name(dimension = nil)
|
271
257
|
name = axr_config[:cache_column].to_s
|
272
258
|
name += "_#{dimension.to_s.underscore}" unless dimension.blank?
|
273
|
-
name += "_#{to_nearest.to_s.gsub('.', '_').underscore}" unless to_nearest.blank?
|
274
259
|
name
|
275
260
|
end
|
276
261
|
end
|
data/lib/axr/stars_builder.rb
CHANGED
@@ -30,7 +30,6 @@ module AjaxfulRating # :nodoc:
|
|
30
30
|
:wrap => true,
|
31
31
|
:small => false,
|
32
32
|
:show_user_rating => false,
|
33
|
-
:disable_remote => false,
|
34
33
|
:force_static => false,
|
35
34
|
:current_user => (@template.current_user if @template.respond_to?(:current_user))
|
36
35
|
}.merge(options)
|
@@ -38,7 +37,7 @@ module AjaxfulRating # :nodoc:
|
|
38
37
|
@options[:small] = @options[:small].to_s == 'true'
|
39
38
|
@options[:show_user_rating] = @options[:show_user_rating].to_s == 'true'
|
40
39
|
@options[:wrap] = @options[:wrap].to_s == 'true'
|
41
|
-
|
40
|
+
|
42
41
|
@remote_options = {
|
43
42
|
:url => nil,
|
44
43
|
:method => :post
|
@@ -50,7 +49,7 @@ module AjaxfulRating # :nodoc:
|
|
50
49
|
if @template.respond_to?(url)
|
51
50
|
@remote_options[:url] = @template.send(url, rateable)
|
52
51
|
else
|
53
|
-
raise(MissingRateRoute)
|
52
|
+
raise(Errors::MissingRateRoute)
|
54
53
|
end
|
55
54
|
end
|
56
55
|
end
|
@@ -65,31 +64,29 @@ module AjaxfulRating # :nodoc:
|
|
65
64
|
|
66
65
|
stars << @template.content_tag(:li, i18n(:current), :class => "show-value",
|
67
66
|
:style => "width: #{width}%")
|
68
|
-
stars += (1..rateable.class.max_stars
|
69
|
-
star_tag(i
|
67
|
+
stars += (1..rateable.class.max_stars).map do |i|
|
68
|
+
star_tag(i)
|
70
69
|
end
|
71
|
-
|
72
|
-
stars = "".respond_to?(:html_safe) ? stars.join.html_safe : stars.join
|
73
|
-
@template.content_tag(:ul, stars, :class => "ajaxful-rating#{' small' if options[:small]}")
|
70
|
+
@template.content_tag(:ul, stars.join.html_safe, :class => "ajaxful-rating#{' small' if options[:small]}")
|
74
71
|
end
|
75
72
|
|
76
73
|
def star_tag(value)
|
77
74
|
already_rated = rateable.rated_by?(user, options[:dimension]) if user
|
78
|
-
css_class = "stars
|
75
|
+
css_class = "stars-#{value}"
|
79
76
|
@css_builder.rule(".ajaxful-rating .#{css_class}", {
|
80
77
|
:width => "#{(value / rateable.class.max_stars.to_f) * 100}%",
|
81
|
-
:zIndex =>
|
78
|
+
:zIndex => (rateable.class.max_stars + 2 - value).to_s
|
82
79
|
})
|
80
|
+
|
83
81
|
@template.content_tag(:li) do
|
84
|
-
if !options[:force_static] && (user && options[:current_user] == user &&
|
85
|
-
(!already_rated || rateable.axr_config[:allow_update]))
|
82
|
+
if !options[:force_static] && (user && options[:current_user] == user && (!already_rated || rateable.axr_config[:allow_update]))
|
86
83
|
link_star_tag(value, css_class)
|
87
84
|
else
|
88
85
|
@template.content_tag(:span, show_value, :class => css_class, :title => i18n(:current))
|
89
86
|
end
|
90
87
|
end
|
91
88
|
end
|
92
|
-
|
89
|
+
|
93
90
|
def link_star_tag(value, css_class)
|
94
91
|
query = {
|
95
92
|
:stars => value,
|
@@ -97,24 +94,21 @@ module AjaxfulRating # :nodoc:
|
|
97
94
|
:small => options[:small],
|
98
95
|
:show_user_rating => options[:show_user_rating]
|
99
96
|
}.to_query
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
:
|
106
|
-
:with => "'#{query}'"
|
97
|
+
|
98
|
+
options = {
|
99
|
+
:class => css_class,
|
100
|
+
:title => i18n(:hover, value),
|
101
|
+
:method => remote_options[:method] || :post,
|
102
|
+
:remote => true
|
107
103
|
}
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
@template.link_to_remote(value, remote_options.merge(config))
|
113
|
-
end
|
104
|
+
|
105
|
+
href = "#{remote_options[:url]}?#{query}"
|
106
|
+
|
107
|
+
@template.link_to(value, href, options)
|
114
108
|
end
|
115
|
-
|
109
|
+
|
116
110
|
def wrapper_tag
|
117
|
-
@template.content_tag(:div, ratings_tag, :class => "ajaxful-rating-wrapper
|
111
|
+
@template.content_tag(:div, ratings_tag, :class => "ajaxful-rating-wrapper",
|
118
112
|
:id => rateable.wrapper_dom_id(options))
|
119
113
|
end
|
120
114
|
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'rails/generators/migration'
|
2
|
+
class AjaxfulRatingGenerator < Rails::Generators::NamedBase
|
3
|
+
include Rails::Generators::Migration
|
4
|
+
|
5
|
+
def self.source_root
|
6
|
+
@_axr_root ||= File.expand_path("../templates", __FILE__)
|
7
|
+
end
|
8
|
+
|
9
|
+
def create_model_files
|
10
|
+
model_file = File.join('app/models', "#{file_path}.rb")
|
11
|
+
raise "User model (#{model_file}) must exits." unless File.exists?(model_file)
|
12
|
+
class_collisions 'Rate'
|
13
|
+
template 'model.rb', File.join('app/models', class_path, "rate.rb")
|
14
|
+
end
|
15
|
+
|
16
|
+
def create_migration
|
17
|
+
migration_template 'migration.rb', "db/migrate/create_rates.rb"
|
18
|
+
end
|
19
|
+
|
20
|
+
def create_layout
|
21
|
+
copy_file 'images/star.png', 'public/images/ajaxful_rating/star.png'
|
22
|
+
copy_file 'images/star_small.png', 'public/images/ajaxful_rating/star_small.png'
|
23
|
+
copy_file 'style.css', 'public/stylesheets/ajaxful_rating.css'
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
# FIXME: Should be proxied to ActiveRecord::Generators::Base
|
29
|
+
# Implement the required interface for Rails::Generators::Migration.
|
30
|
+
def self.next_migration_number(dirname) #:nodoc:
|
31
|
+
if ActiveRecord::Base.timestamped_migrations
|
32
|
+
Time.now.utc.strftime("%Y%m%d%H%M%S")
|
33
|
+
else
|
34
|
+
"%.3d" % (current_migration_number(dirname) + 1)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
@@ -0,0 +1,41 @@
|
|
1
|
+
rate_audi_denis:
|
2
|
+
rater_id: 1 # Denis
|
3
|
+
rateable_id: 1 # Audi
|
4
|
+
rateable_type: Car
|
5
|
+
stars: 6
|
6
|
+
dimension:
|
7
|
+
|
8
|
+
rate_audi_denis_speed:
|
9
|
+
rater_id: 1 # Denis
|
10
|
+
rateable_id: 1 # Audi
|
11
|
+
rateable_type: Car
|
12
|
+
stars: 7
|
13
|
+
dimension: speed
|
14
|
+
|
15
|
+
rate_audi_denis_reliability:
|
16
|
+
rater_id: 1 # Denis
|
17
|
+
rateable_id: 1 # Audi
|
18
|
+
rateable_type: Car
|
19
|
+
stars: 5
|
20
|
+
dimension: reliability
|
21
|
+
|
22
|
+
rate_audi_john:
|
23
|
+
rater_id: 2 # John
|
24
|
+
rateable_id: 1 # Audi
|
25
|
+
rateable_type: Car
|
26
|
+
stars: 8
|
27
|
+
dimension:
|
28
|
+
|
29
|
+
rate_audi_john_speed:
|
30
|
+
rater_id: 2 # John
|
31
|
+
rateable_id: 1 # Audi
|
32
|
+
rateable_type: Car
|
33
|
+
stars: 8
|
34
|
+
dimension: speed
|
35
|
+
|
36
|
+
rate_audi_john_reliability:
|
37
|
+
rater_id: 2 # John
|
38
|
+
rateable_id: 2 # Audi
|
39
|
+
rateable_type: Car
|
40
|
+
stars: 5
|
41
|
+
dimension: reliability
|
@@ -0,0 +1,22 @@
|
|
1
|
+
ActiveRecord::Schema.define do
|
2
|
+
create_table "cars", :force => true do |t|
|
3
|
+
t.string "name"
|
4
|
+
t.datetime "created_at"
|
5
|
+
t.datetime "updated_at"
|
6
|
+
end
|
7
|
+
|
8
|
+
create_table "rates", :force => true do |t|
|
9
|
+
t.integer "rater_id"
|
10
|
+
t.integer "rateable_id"
|
11
|
+
t.string "rateable_type"
|
12
|
+
t.integer "stars", :null => false
|
13
|
+
t.string "dimension"
|
14
|
+
end
|
15
|
+
|
16
|
+
add_index "rates", ["rateable_id", "rateable_type"], :name => "index_rates_on_rateable_id_and_rateable_type"
|
17
|
+
add_index "rates", ["rater_id"], :name => "index_rates_on_rater_id"
|
18
|
+
|
19
|
+
create_table "users", :force => true do |t|
|
20
|
+
t.string "name"
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require File.dirname(__FILE__) + "/../test_helper"
|
2
|
+
|
3
|
+
class ModelTest < ActiveSupport::TestCase
|
4
|
+
include ActiveRecord::TestFixtures
|
5
|
+
|
6
|
+
def setup
|
7
|
+
@audi = Car.find_by_name("Audi")
|
8
|
+
@infinity = Car.find_by_name("Infinity")
|
9
|
+
|
10
|
+
@denis = User.find_by_name("Denis Odorcic")
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_find_statement
|
14
|
+
assert_equal Car.find_statement(:stars, 7).size, 0
|
15
|
+
assert_equal Car.find_statement(:stars, 8).size, 1
|
16
|
+
assert_equal Car.find_statement(:stars, 8, :speed).size, 1
|
17
|
+
assert_equal Car.find_statement(:stars, 5, :reliability).size, 2
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_rate_higher_than_max_stars
|
21
|
+
assert_equal Car.max_stars, 10
|
22
|
+
assert !@audi.rate(15, User.first)
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_already_rated_error
|
26
|
+
Car.axr_config[:allow_update] = false
|
27
|
+
assert @audi.rated_by?(@denis)
|
28
|
+
assert_raise AjaxfulRating::Errors::AlreadyRatedError do
|
29
|
+
@audi.rate(4, @denis)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_already_rated_and_allowed_to_update
|
34
|
+
assert @audi.rated_by?(@denis)
|
35
|
+
stars = @audi.rate_by(@denis).stars
|
36
|
+
|
37
|
+
assert_no_difference 'Rate.count' do
|
38
|
+
@audi.rate(1, @denis)
|
39
|
+
end
|
40
|
+
assert_equal @audi.rate_by(@denis).stars, 1
|
41
|
+
assert_not_equal @audi.rate_by(@denis).stars, stars
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_new_rating
|
45
|
+
assert_difference 'Rate.count', 1 do
|
46
|
+
@audi.rate(5, @denis, :price)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_raters
|
51
|
+
assert_equal @audi.raters.size, 2
|
52
|
+
assert_difference 'Rate.count', 1 do
|
53
|
+
@audi.rate(3, User.create(:name => "Bob"))
|
54
|
+
end
|
55
|
+
assert_equal @audi.raters.size, 3
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
$:.unshift File.dirname(__FILE__) + '/../lib'
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'test/unit'
|
5
|
+
require 'active_record'
|
6
|
+
require 'active_record/fixtures'
|
7
|
+
require 'action_controller'
|
8
|
+
require 'ajaxful_rating'
|
9
|
+
|
10
|
+
AXR_FIXTURES_PATH = File.join(File.dirname(__FILE__), 'fixtures')
|
11
|
+
|
12
|
+
# For transactional fixtures to work in tests, configurations in AR::Base has to be set to something
|
13
|
+
ActiveRecord::Base.configurations = {:epic => 'fail'}
|
14
|
+
ActiveRecord::Base.establish_connection(:adapter => 'sqlite3', :database => ':memory:')
|
15
|
+
|
16
|
+
# Add fixtures to load path
|
17
|
+
dep = defined?(ActiveSupport::Dependencies) ? ActiveSupport::Dependencies : ::Dependencies
|
18
|
+
dep.load_paths.unshift AXR_FIXTURES_PATH
|
19
|
+
|
20
|
+
ActiveRecord::Base.silence do
|
21
|
+
ActiveRecord::Migration.verbose = false
|
22
|
+
load File.join(AXR_FIXTURES_PATH, 'schema.rb')
|
23
|
+
end
|
24
|
+
|
25
|
+
Fixtures.create_fixtures(AXR_FIXTURES_PATH, ActiveRecord::Base.connection.tables)
|
metadata
CHANGED
@@ -1,54 +1,43 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ajaxful_rating
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
prerelease:
|
4
|
+
prerelease: true
|
6
5
|
segments:
|
7
|
-
-
|
8
|
-
-
|
9
|
-
-
|
10
|
-
-
|
11
|
-
version:
|
6
|
+
- 3
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
- beta1
|
10
|
+
version: 3.0.0.beta1
|
12
11
|
platform: ruby
|
13
12
|
authors:
|
14
13
|
- Edgar J. Suarez
|
14
|
+
- Denis Odorcic
|
15
15
|
autorequire:
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
18
|
|
19
|
-
date:
|
19
|
+
date: 2010-05-03 00:00:00 -05:00
|
20
|
+
default_executable:
|
20
21
|
dependencies: []
|
21
22
|
|
22
23
|
description: Provides a simple way to add rating functionality to your application.
|
23
|
-
email:
|
24
|
+
email:
|
25
|
+
- edgar.js@gmail.com
|
26
|
+
- denis.odorcic@gmail.com
|
24
27
|
executables: []
|
25
28
|
|
26
29
|
extensions: []
|
27
30
|
|
28
31
|
extra_rdoc_files:
|
29
|
-
-
|
32
|
+
- ChangeLog
|
30
33
|
- README.textile
|
31
|
-
- lib/ajaxful_rating.rb
|
32
|
-
- lib/axr/css_builder.rb
|
33
|
-
- lib/axr/errors.rb
|
34
|
-
- lib/axr/helpers.rb
|
35
|
-
- lib/axr/locale.rb
|
36
|
-
- lib/axr/model.rb
|
37
|
-
- lib/axr/stars_builder.rb
|
38
34
|
files:
|
35
|
+
- .gitignore
|
39
36
|
- CHANGELOG
|
40
37
|
- Manifest
|
41
38
|
- README.textile
|
42
39
|
- Rakefile
|
43
40
|
- ajaxful_rating.gemspec
|
44
|
-
- generators/ajaxful_rating/USAGE
|
45
|
-
- generators/ajaxful_rating/ajaxful_rating_generator.rb
|
46
|
-
- generators/ajaxful_rating/templates/images/star.png
|
47
|
-
- generators/ajaxful_rating/templates/images/star_small.png
|
48
|
-
- generators/ajaxful_rating/templates/migration.rb
|
49
|
-
- generators/ajaxful_rating/templates/model.rb
|
50
|
-
- generators/ajaxful_rating/templates/style.css
|
51
|
-
- init.rb
|
52
41
|
- lib/ajaxful_rating.rb
|
53
42
|
- lib/axr/css_builder.rb
|
54
43
|
- lib/axr/errors.rb
|
@@ -56,44 +45,59 @@ files:
|
|
56
45
|
- lib/axr/locale.rb
|
57
46
|
- lib/axr/model.rb
|
58
47
|
- lib/axr/stars_builder.rb
|
48
|
+
- lib/generators/ajaxful_rating/USAGE
|
49
|
+
- lib/generators/ajaxful_rating/ajaxful_rating_generator.rb
|
50
|
+
- lib/generators/ajaxful_rating/templates/images/star.png
|
51
|
+
- lib/generators/ajaxful_rating/templates/images/star_small.png
|
52
|
+
- lib/generators/ajaxful_rating/templates/migration.rb
|
53
|
+
- lib/generators/ajaxful_rating/templates/model.rb
|
54
|
+
- lib/generators/ajaxful_rating/templates/style.css
|
55
|
+
- test/fixtures/car.rb
|
56
|
+
- test/fixtures/cars.yml
|
57
|
+
- test/fixtures/rate.rb
|
58
|
+
- test/fixtures/rates.yml
|
59
|
+
- test/fixtures/schema.rb
|
60
|
+
- test/fixtures/user.rb
|
61
|
+
- test/fixtures/users.yml
|
62
|
+
- test/lib/model_test.rb
|
63
|
+
- test/test_helper.rb
|
64
|
+
- ChangeLog
|
65
|
+
has_rdoc: true
|
59
66
|
homepage: http://github.com/edgarjs/ajaxful-rating
|
60
67
|
licenses: []
|
61
68
|
|
62
69
|
post_install_message:
|
63
70
|
rdoc_options:
|
64
|
-
- --
|
65
|
-
- --inline-source
|
66
|
-
- --title
|
67
|
-
- Ajaxful_rating
|
68
|
-
- --main
|
69
|
-
- README.textile
|
71
|
+
- --charset=UTF-8
|
70
72
|
require_paths:
|
71
73
|
- lib
|
72
74
|
required_ruby_version: !ruby/object:Gem::Requirement
|
73
|
-
none: false
|
74
75
|
requirements:
|
75
76
|
- - ">="
|
76
77
|
- !ruby/object:Gem::Version
|
77
|
-
hash: 3
|
78
78
|
segments:
|
79
79
|
- 0
|
80
80
|
version: "0"
|
81
81
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
82
|
-
none: false
|
83
82
|
requirements:
|
84
|
-
- - "
|
83
|
+
- - ">"
|
85
84
|
- !ruby/object:Gem::Version
|
86
|
-
hash: 11
|
87
85
|
segments:
|
88
86
|
- 1
|
89
|
-
-
|
90
|
-
|
87
|
+
- 3
|
88
|
+
- 1
|
89
|
+
version: 1.3.1
|
91
90
|
requirements: []
|
92
91
|
|
93
|
-
rubyforge_project:
|
94
|
-
rubygems_version: 1.
|
92
|
+
rubyforge_project:
|
93
|
+
rubygems_version: 1.3.6
|
95
94
|
signing_key:
|
96
95
|
specification_version: 3
|
97
96
|
summary: Provides a simple way to add rating functionality to your application.
|
98
|
-
test_files:
|
99
|
-
|
97
|
+
test_files:
|
98
|
+
- test/fixtures/car.rb
|
99
|
+
- test/fixtures/rate.rb
|
100
|
+
- test/fixtures/schema.rb
|
101
|
+
- test/fixtures/user.rb
|
102
|
+
- test/lib/model_test.rb
|
103
|
+
- test/test_helper.rb
|
@@ -1,30 +0,0 @@
|
|
1
|
-
class AjaxfulRatingGenerator < Rails::Generator::NamedBase
|
2
|
-
def initialize(runtime_args, runtime_options = {})
|
3
|
-
super
|
4
|
-
|
5
|
-
# if there's no user model
|
6
|
-
model_file = File.join('app/models', "#{file_path}.rb")
|
7
|
-
raise "User model (#{model_file}) must exits." unless File.exists?(model_file)
|
8
|
-
end
|
9
|
-
|
10
|
-
def manifest
|
11
|
-
record do |m|
|
12
|
-
m.class_collisions 'Rate'
|
13
|
-
m.template 'model.rb', File.join('app/models', 'rate.rb')
|
14
|
-
m.migration_template 'migration.rb', 'db/migrate',
|
15
|
-
:migration_file_name => 'create_rates'
|
16
|
-
|
17
|
-
# style
|
18
|
-
m.directory 'public/images/ajaxful_rating'
|
19
|
-
m.file 'images/star.png', 'public/images/ajaxful_rating/star.png'
|
20
|
-
m.file 'images/star_small.png', 'public/images/ajaxful_rating/star_small.png'
|
21
|
-
m.file 'style.css', 'public/stylesheets/ajaxful_rating.css'
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
protected
|
26
|
-
|
27
|
-
def banner
|
28
|
-
"Usage: #{$0} ajaxful_rating UserModelName"
|
29
|
-
end
|
30
|
-
end
|
data/init.rb
DELETED
@@ -1,6 +0,0 @@
|
|
1
|
-
puts "------------------------------------------"
|
2
|
-
puts "IMPORTANT: AjaxfulRating has been updated to v2.2.x and some options changed."\
|
3
|
-
"Please read the changelog at http://github.com/edgarjs/ajaxful-rating/blob/master/CHANGELOG"
|
4
|
-
puts "------------------------------------------"
|
5
|
-
|
6
|
-
require 'ajaxful_rating'
|