刚完成的一个小插件,比较粗糙,欢迎多提意见。
安装
$ cd vendor/plugins
$ git clone git://github.com/yzhang/ajax_rating.git
使用
在你要评分的model中添加acts_as_ratable,比如post:
class Post < ActiveRecord::Base
:acts_as_ratable
end
这为post增加了如下方法:
- rating,当前post的平均得分
- rating_count,评分人数
在可以打分的Model中添加acts_as_rater,比如user:
class User < ActiveRecord::Base
:acts_as_rater
end
这为User增加了如下方法:
- rating_on(ratable),返回这个用户为某个对象打的分(1-5)
然后在view中调用:
rating_tag(rater, ratable)
rater就是打分者,ratable则是被评分的对象,如果rater为nil,则用户只能看到分数,但不能打分。
如果需要自定义外观,可以修改rating.css和images下的star123.png,关于CSS的原理说明请参看(十分对不起原作者,找不到原始出处):http://www.viphot.com/InfoView/Article_285645.html
如果为了安全考虑,需要限制只有当前登录用户可以打分,可以通过定义RatingsController#current_rater实现:
class RatingsController < ActiveController::Base
:before_filter :login_required
def current_rater
current_user
end
end
这样客户端传递的rater参数将失去作用。
完整例子
1. 创建demo:
$ rails ratable_demo
$ cd ratable_demo
2. 安装RESTFul_Auth
$ git clone git://github.com/technoweenie/restful-authentication.git vendor/plugins/restful_authentication
$ ./script/generate authenticated user sessions
3. 安装Ajax Rating
$ cd vendor/plugins
$ git clone git://github.com/yzhang/ajax_rating.git
$ cd ../../
$ ./script/generate ratable
4. 创建打分对象
$ ./script/generate scaffold post title:string body:text
$ rake db:migrate
5. 修改user.rb
class User < ActiveRecord::Base
:acts_as_rater
end
6. 修改post.rb
class Post < ActiveRecord::Base
acts_as_ratable
end
7. 修改 app/views/layout/posts.html.erb,包含Prototype和rating.css:
<%= stylesheet_link_tag 'scaffold', 'rating' %>
<%= javascript_include_tag :defaults %>
8. 修改application.rb:
include AuthenticatedSystem
9. 修改app/views/posts/show.html.erb:
<% if logged_in? -%>
<%= rating_tag current_user, @post %>
<% else -%>
<%= rating_tag nil, @post %>
<%= link_to 'login to rating this post', new_session_path %>
<% end -%>
启动server,打开浏览器到/posts,创建一个新的Post,应该就可以看到一个打分的标签了。


