用acts_as_rateable兑现简单的打分功能

用acts_as_rateable实现简单的打分功能

acts_as_rateable插件为ActiveRecord模型对象提供评分/评级的功能,下面的示例是一个简单的打分功能。

 

1、安装插件

 

ruby script/plugin install svn://rubyforge.org/var/svn/rateableplugin/trunk

 

2、创建表

 

def self.up
  create_table :ratings do |t|
    t.integer :rating
    t.integer :rateable_id, :null => false
    t.string :rateable_type, :null => false
  end
  add_index :ratings, [:rateable_id, :rating]
end

def self.down
  drop_table :ratings
end

 

3、为模型增加打分功能

 

class Entry < ActiveRecord::Base

  acts_as_rateable

end

 

4、修改路由

 

map.resources :entries, :member => { :rating => :post }

 

5、增加打分表单

 

<% form_tag rating_entry_path(@entry) do %>
  请评分
  <% (1..5).each do |value| %>
    <%= radio_button_tag :rating, value, true %><%= value %>
  <% end %>
  <%= submit_tag '打分' %>
<% end %>

 

6、打分方法

 

def rating
  Entry.find(params[:id]).rating = params[:rating]
  redirect_to entries_url
end

 

7、显示打分结果

 

<%= h entry.rating %>

 

以上的示例只能为每个entry保留一个评分,如果希望能够多次评分,以获得平均分的话,可以在model中增加average参数:

 

class Entry < ActiveRecord::Base

  acts_as_rateable :average => true

end

 

打分界面也可以像下面这样来写:

 

<%= stars(@entry, :filled_star => "X", :empty_star => "x") do |content,rating,filled|
  link_to content, :controller => "entries", :action => "rating", :id => @entry.id, :rating => rating
end
%>