ajaxful_rating 2.1.3 → 2.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG +3 -0
- data/README.textile +85 -73
- data/Rakefile +2 -2
- data/ajaxful_rating.gemspec +3 -3
- data/lib/ajaxful_rating_helper.rb +22 -8
- metadata +3 -3
data/CHANGELOG
CHANGED
data/README.textile
CHANGED
@@ -43,10 +43,10 @@ Also this generator copies the necesary images, styles, etc.
|
|
43
43
|
Example:
|
44
44
|
_I suppose you have generated already an authenticated model..._
|
45
45
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
46
|
+
<pre>
|
47
|
+
script/generate authenticated user sessions
|
48
|
+
script/generate ajaxful_rating user
|
49
|
+
</pre>
|
50
50
|
|
51
51
|
So this call will create a Rate model and will link it to your User model.
|
52
52
|
|
@@ -60,20 +60,20 @@ customise this call:
|
|
60
60
|
* @:dimensions@ Array of dimensions. Allows to rate the model on various specs,
|
61
61
|
like for example: a car could be rated for its speed, beauty or price.
|
62
62
|
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
63
|
+
<pre>
|
64
|
+
class Car < ActiveRecord::Base
|
65
|
+
ajaxful_rateable :stars => 10, :dimensions => [:speed, :beauty, :price]
|
66
|
+
end
|
67
|
+
</pre>
|
68
68
|
|
69
69
|
Then you need to add a call @ajaxful_rater@ in the user model. This includes a simple line so
|
70
70
|
you can add it _by your own_ as well (@has_many :rates@).
|
71
71
|
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
72
|
+
<pre>
|
73
|
+
class User < ActiveRecord::Base
|
74
|
+
ajaxful_rater
|
75
|
+
end
|
76
|
+
</pre>
|
77
77
|
|
78
78
|
Finally, as a mere recomendation to make it even easier, modify your routes to
|
79
79
|
map a rate action:
|
@@ -87,54 +87,66 @@ It tries to call @current_user@ method as the rater instance. You can pass @:sta
|
|
87
87
|
as the second param to display only the static stars (not clickables).
|
88
88
|
And also you can pass the dimension you want to show the ratings for.
|
89
89
|
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
90
|
+
<pre>
|
91
|
+
#show.html.erb
|
92
|
+
<%= ratings_for @article %>
|
93
|
+
|
94
|
+
#To display static stars:
|
95
|
+
<%= ratings_for @article, :static %>
|
96
96
|
|
97
|
-
|
98
|
-
|
99
|
-
|
97
|
+
#To display the ratings for a dimension:
|
98
|
+
<%= ratings_for @article, :dimension => :speed %>
|
99
|
+
</pre>
|
100
100
|
|
101
101
|
Or you can specify a custom user instance by passing it as parameter.
|
102
102
|
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
103
|
+
<pre>
|
104
|
+
<%= ratings_for @article, @user %>
|
105
|
+
</pre>
|
106
|
+
|
107
|
+
By default ratings_for will display the average user rating. If you would like it to
|
108
|
+
display the rating for the current_user, then set the :show_user_rating parameter to true.
|
109
|
+
For example:
|
110
|
+
|
111
|
+
<pre>
|
112
|
+
# To display the rating for the current user (current_user):
|
113
|
+
<%= ratings_for @article, :show_user_rating => true %>
|
114
|
+
|
115
|
+
# To display the rating for the user specified by @user:
|
116
|
+
<%= ratings_for @article, @user, :show_user_rating => true %>
|
117
|
+
</pre>
|
118
|
+
|
107
119
|
There's a condition here, if you didn't add the route @rate@ to your resource
|
108
120
|
(as shown above) or you named it different, you'll need to pass the url to the
|
109
121
|
correct action in your controller:
|
110
122
|
|
111
|
-
|
112
|
-
|
113
|
-
|
123
|
+
<pre>
|
124
|
+
<%= ratings_for @article, :remote_options => {:url => your_rate_path(@article)} %>
|
125
|
+
</pre>
|
114
126
|
|
115
127
|
*To display the stars properly you need to add a call in the head of your layout, which will generate the
|
116
128
|
required CSS style for the list. Also don't forget to include the javascripts.*
|
117
129
|
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
130
|
+
<pre>
|
131
|
+
#within the head tags of your layout...
|
132
|
+
<%= javascript_include_tag :defaults %>
|
133
|
+
<%= ajaxful_rating_style %>
|
134
|
+
</pre>
|
123
135
|
|
124
136
|
When a user submits a rating it will call the action in your controller, for
|
125
137
|
example (if you added the @rate@ route):
|
126
138
|
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
end
|
139
|
+
<pre>
|
140
|
+
def rate
|
141
|
+
@article = Article.find(params[:id])
|
142
|
+
@article.rate(params[:stars], current_user, params[:dimension])
|
143
|
+
id = "ajaxful-rating-#{!params[:dimension].blank? ? "#{params[:dimension]}-" : ''}article-#{@article.id}"
|
144
|
+
render :update do |page|
|
145
|
+
page.replace_html id, ratings_for(@article, :wrap => false, :dimension => params[:dimension])
|
146
|
+
page.visual_effect :highlight, id
|
136
147
|
end
|
137
|
-
|
148
|
+
end
|
149
|
+
</pre>
|
138
150
|
|
139
151
|
There are some more options for this helper, please see the rdoc for details.
|
140
152
|
|
@@ -145,11 +157,11 @@ corresponding rates for the dimension you want.
|
|
145
157
|
|
146
158
|
For example, you defined these dimensions:
|
147
159
|
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
160
|
+
<pre>
|
161
|
+
class Car < ActiveRecord::Base
|
162
|
+
ajaxful_rateable :dimensions => [:speed, :beauty, :price]
|
163
|
+
end
|
164
|
+
</pre>
|
153
165
|
|
154
166
|
And hence you can call @car.rates(:price)@ for the price rates or @car.rates(:speed)@ for the speed ratings and so on.
|
155
167
|
|
@@ -158,39 +170,39 @@ h3. Namespaces
|
|
158
170
|
If you use the plugin inside a namespace you’ll need to specify the rating url which should points to
|
159
171
|
a controller inside a namespace. Your files should be like these:
|
160
172
|
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
173
|
+
<pre>
|
174
|
+
routes.rb:
|
175
|
+
map.namespace :admin do |admin|
|
176
|
+
admin.resources :articles, :member => {:rate => :post}
|
177
|
+
end
|
166
178
|
|
167
|
-
|
168
|
-
|
169
|
-
|
179
|
+
views/admin/articles/show.html.erb
|
180
|
+
<%= ratings_for @article, :remote_options => {:url => rate_admin_article_path(@article)} %>
|
181
|
+
</pre>
|
170
182
|
|
171
183
|
h3. Cache
|
172
184
|
|
173
185
|
To cache the model's rating average add a column named @rating_average@ to your model table:
|
174
186
|
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
end
|
180
|
-
|
181
|
-
def self.down
|
182
|
-
remove_column :articles, :rating_average
|
183
|
-
end
|
187
|
+
<pre>
|
188
|
+
class AddRatingAverageToArticles < ActiveRecord::Migration
|
189
|
+
def self.up
|
190
|
+
add_column :articles, :rating_average, :decimal, :default => 0, :precision => 6, :scale => 2
|
184
191
|
end
|
185
|
-
|
192
|
+
|
193
|
+
def self.down
|
194
|
+
remove_column :articles, :rating_average
|
195
|
+
end
|
196
|
+
end
|
197
|
+
</pre>
|
186
198
|
|
187
199
|
If you want to customise the name of the cache column just pass it in the options hash:
|
188
200
|
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
201
|
+
<pre>
|
202
|
+
class Article < ActiveRecord::Base
|
203
|
+
ajaxful_rateable :cache_column => :my_cached_rating
|
204
|
+
end
|
205
|
+
</pre>
|
194
206
|
|
195
207
|
To use caching with dimensions, make sure you have a cache column defined for each dimension you want cached.
|
196
208
|
So if you want to cache the @spelling@ dimension, you’ll need to have a column called @rating_average_spelling@ on the articles table.
|
data/Rakefile
CHANGED
@@ -2,11 +2,11 @@ require 'rubygems'
|
|
2
2
|
require 'rake'
|
3
3
|
require 'echoe'
|
4
4
|
|
5
|
-
Echoe.new('ajaxful_rating', '2.1.
|
5
|
+
Echoe.new('ajaxful_rating', '2.1.4') do |p|
|
6
6
|
p.description = "Provides a simple way to add rating functionality to your application."
|
7
7
|
p.url = "http://github.com/edgarjs/ajaxful-rating"
|
8
8
|
p.author = "Edgar J. Suarez"
|
9
|
-
p.email = "
|
9
|
+
p.email = "edgar.js@gmail.com"
|
10
10
|
p.ignore_pattern = ["tmp/*", "script/*"]
|
11
11
|
p.development_dependencies = []
|
12
12
|
end
|
data/ajaxful_rating.gemspec
CHANGED
@@ -2,13 +2,13 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = %q{ajaxful_rating}
|
5
|
-
s.version = "2.1.
|
5
|
+
s.version = "2.1.4"
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
8
8
|
s.authors = ["Edgar J. Suarez"]
|
9
|
-
s.date = %q{
|
9
|
+
s.date = %q{2010-01-25}
|
10
10
|
s.description = %q{Provides a simple way to add rating functionality to your application.}
|
11
|
-
s.email = %q{
|
11
|
+
s.email = %q{edgar.js@gmail.com}
|
12
12
|
s.extra_rdoc_files = ["CHANGELOG", "README.textile", "lib/ajaxful_rating.rb", "lib/ajaxful_rating_helper.rb", "lib/ajaxful_rating_model.rb"]
|
13
13
|
s.files = ["CHANGELOG", "Manifest", "README.textile", "Rakefile", "ajaxful_rating.gemspec", "generators/ajaxful_rating/USAGE", "generators/ajaxful_rating/ajaxful_rating_generator.rb", "generators/ajaxful_rating/templates/images/star.png", "generators/ajaxful_rating/templates/images/star_small.png", "generators/ajaxful_rating/templates/migration.rb", "generators/ajaxful_rating/templates/model.rb", "generators/ajaxful_rating/templates/style.css", "init.rb", "lib/ajaxful_rating.rb", "lib/ajaxful_rating_helper.rb", "lib/ajaxful_rating_model.rb"]
|
14
14
|
s.homepage = %q{http://github.com/edgarjs/ajaxful-rating}
|
@@ -17,6 +17,7 @@ module AjaxfulRating # :nodoc:
|
|
17
17
|
# * <tt>:remote_options</tt> Hash of options for the link_to_remote function.
|
18
18
|
# Default is {:method => :post, :url => rate_rateablemodel_path(rateable)}.
|
19
19
|
# * <tt>:wrap</tt> Whether the star list is wrapped within a div tag or not. This is useful when page updating. Default is true.
|
20
|
+
# * <tt>:force_dynamic</tt> Whether the star list is always clickable. This is useful for page caching when set to true. Default is false.
|
20
21
|
#
|
21
22
|
# Example:
|
22
23
|
# <%= ratings_for @article %>
|
@@ -53,6 +54,13 @@ module AjaxfulRating # :nodoc:
|
|
53
54
|
# # update page, etc.
|
54
55
|
# end
|
55
56
|
#
|
57
|
+
# By default ratings_for will render the average rating for all users. If however you would like to display the rating for a single user, then set the :show_user_rating option to true.
|
58
|
+
# For example:
|
59
|
+
#
|
60
|
+
# <%= ratings_for @article, :show_user_rating => true %>
|
61
|
+
# Or
|
62
|
+
# <%= ratings_for @article, @user, :show_user_rating => true %>
|
63
|
+
#
|
56
64
|
# I18n:
|
57
65
|
#
|
58
66
|
# You can translate the title of the images (the tool tip that shows when the mouse is over) and the 'Currently x/x stars'
|
@@ -66,20 +74,24 @@ module AjaxfulRating # :nodoc:
|
|
66
74
|
# other: "{{count}} stars out of {{total}}"
|
67
75
|
def ratings_for(rateable, *args)
|
68
76
|
user = extract_options(rateable, *args)
|
77
|
+
user_rating = if options[:show_user_rating] == true and rateable.rated_by?(user, options[:dimension])
|
78
|
+
rateable.rates(options[:dimension]).find_by_user_id(user).stars
|
79
|
+
else
|
80
|
+
user_rating = 0
|
81
|
+
end
|
69
82
|
ajaxful_styles << %Q(
|
70
83
|
.#{options[:class]} { width: #{rateable.class.max_rate_value * 25}px; }
|
71
84
|
.#{options[:small_star_class]} { width: #{rateable.class.max_rate_value * 10}px; }
|
72
85
|
)
|
73
|
-
width = (rateable.rate_average(true, options[:dimension]) / rateable.class.max_rate_value.to_f) * 100
|
86
|
+
width = ((options[:show_user_rating] == true ? user_rating : rateable.rate_average(true, options[:dimension])) / rateable.class.max_rate_value.to_f) * 100
|
74
87
|
ul = content_tag(:ul, options[:html]) do
|
75
|
-
|
88
|
+
(1..rateable.class.max_rate_value).collect do |i|
|
76
89
|
build_star rateable, user, i
|
77
|
-
end.insert(0, content_tag(:li, current_average(rateable),
|
78
|
-
:class => 'current-rating', :style => "width:#{width}%"))
|
90
|
+
end.insert(0, content_tag(:li, current_average(rateable), :class => 'current-rating', :style => "width:#{width}%")).join
|
79
91
|
end
|
80
92
|
if options[:wrap]
|
81
93
|
content_tag(:div, ul, :class => 'ajaxful-rating-wrapper', :id => "ajaxful-rating-#{!options[:dimension].blank? ?
|
82
|
-
"#{options[:dimension]}-" : ''}#{rateable.class.name.
|
94
|
+
"#{options[:dimension]}-" : ''}#{rateable.class.name.tableize.singularize}-#{rateable.id}")
|
83
95
|
else
|
84
96
|
ul
|
85
97
|
end
|
@@ -109,7 +121,7 @@ module AjaxfulRating # :nodoc:
|
|
109
121
|
}
|
110
122
|
)
|
111
123
|
rated = rateable.rated_by?(user, options[:dimension]) if user
|
112
|
-
star = if user && ((rated && rateable.class.options[:allow_update]) || !rated)
|
124
|
+
star = if options[:force_dynamic] || (user && ((rated && rateable.class.options[:allow_update]) || !rated))
|
113
125
|
link_to_remote(i, build_remote_options({:class => a_class, :title => pluralize_title(i, rateable.class.max_rate_value)}, i))
|
114
126
|
else
|
115
127
|
content_tag(:span, i, :class => a_class, :title => current_average(rateable))
|
@@ -121,6 +133,7 @@ module AjaxfulRating # :nodoc:
|
|
121
133
|
def options
|
122
134
|
@ajaxful_options ||= {
|
123
135
|
:wrap => true,
|
136
|
+
:force_dynamic => false,
|
124
137
|
:class => 'ajaxful-rating',
|
125
138
|
:link_class_prefix => :stars,
|
126
139
|
:small_stars => false,
|
@@ -155,6 +168,7 @@ module AjaxfulRating # :nodoc:
|
|
155
168
|
|
156
169
|
# Extracts the hash options and returns the user instance.
|
157
170
|
def extract_options(rateable, *args)
|
171
|
+
options[:show_user_rating] = false # Reset
|
158
172
|
user = if args.first.class.name == rateable.class.user_class_name.classify
|
159
173
|
args.shift
|
160
174
|
elsif args.first != :static
|
@@ -163,9 +177,9 @@ module AjaxfulRating # :nodoc:
|
|
163
177
|
config = (!args.empty? && args.last.is_a?(Hash)) ? args.last : {}
|
164
178
|
if config[:remote_options] && config[:remote_options][:url]
|
165
179
|
# we keep the passed url
|
166
|
-
|
180
|
+
else#if user
|
167
181
|
config[:remote_options] = {
|
168
|
-
:url => respond_to?(url = "rate_#{rateable.class.name.
|
182
|
+
:url => respond_to?(url = "rate_#{rateable.class.name.tableize.singularize}_path") ?
|
169
183
|
send(url, rateable) : raise(MissingRateRoute)
|
170
184
|
}
|
171
185
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ajaxful_rating
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.1.
|
4
|
+
version: 2.1.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Edgar J. Suarez
|
@@ -9,12 +9,12 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date:
|
12
|
+
date: 2010-01-25 00:00:00 -06:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
16
16
|
description: Provides a simple way to add rating functionality to your application.
|
17
|
-
email:
|
17
|
+
email: edgar.js@gmail.com
|
18
18
|
executables: []
|
19
19
|
|
20
20
|
extensions: []
|