<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>app/views/versions/vote.rjs</filename>
    </added>
    <added>
      <filename>db/migrate/20090705092959_vote_rejig.rb</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -37,20 +37,28 @@ class VersionsController &lt; ApplicationController
     @diff = HTMLDiff::diff(@vb.text.split(/\n|&lt;p&gt;/), @va.text.split(/\n|&lt;p&gt;/))
   rescue ActiveRecord::RecordNotFound =&gt; e
     flash[:error] = e.message
-    redirect_to :action =&gt; :list
+    redirect_to articles_url
   end
   
   def vote
     @version = NewsArticleVersion.find(params[:id])
-    if is_admin?
-      # An admin vote is with 5, and gets unlimited votes
-      5.times { @voted = Vote.vote @version }
-    else
-      @voted = Vote.vote @version, cookies['_session_id']
+    @vote = Vote.vote! @version, session[:session_id]
+    respond_to do |format|
+      format.html do
+        flash[:notice] = 'Thank you for your recommendation'
+        redirect_to news_article_version_url(@version.article, @version)
+      end
+      format.js
     end
-    unless request.xhr?
-      flash[:notice] = 'Thank you for your recommendation'
-      redirect_to :controller =&gt; 'news_articles', :action =&gt; 'list' #FIXME
+  rescue ActiveRecord::RecordNotFound =&gt; e
+  rescue ActiveRecord::RecordInvalid =&gt; e
+    @exception = e
+    respond_to do |format|
+      format.html do
+        flash[:error] = e.message
+        redirect_to news_articles_url
+      end
+      format.js
     end
   end
 </diff>
      <filename>app/controllers/versions_controller.rb</filename>
    </modified>
    <modified>
      <diff>@@ -17,25 +17,13 @@
 #
 class Vote &lt; ActiveRecord::Base
 
-  before_destroy :dec_class_votes
+  validates_presence_of :thing
+  validates_uniqueness_of :thing_id, :scope =&gt; [:thing_type, :sessionid], :message =&gt; 'already voted'
+  
+  belongs_to :thing, :polymorphic =&gt; true, :counter_cache =&gt; :votes
 
-  def voted_object
-    eval(read_attribute('class')).find(self.relation_id)
-  end
-
-  def self.vote(ob, sessionid = rand(99999999))
-    return false unless ob.is_a? ActiveRecord::Base
-    return false if Vote.find(:first, 
-      :conditions =&gt; ['class = ? and sessionid = ? and relation_id = ?', ob.class.class_name, sessionid, ob.id])
-    ob.class.increment_counter('votes', ob.id) if ob.class.column_names.include? &quot;votes&quot;
-    return Vote.create( { :class =&gt; ob.class.class_name, :sessionid =&gt; sessionid, :relation_id =&gt; ob.id } )
-  end
-
-  private
-
-  def dec_class_votes
-    obclass = eval(read_attribute('class'))
-    obclass.decrement_counter('votes', relation_id) if obclass.column_names.include? &quot;votes&quot;
+  def self.vote!(thing, sessionid = rand(99999999))
+    Vote.create!(:thing =&gt; thing, :sessionid =&gt; sessionid)
   end
 
 end</diff>
      <filename>app/models/vote.rb</filename>
    </modified>
    <modified>
      <diff>@@ -4,7 +4,7 @@
 on &lt;strong&gt;&lt;%= @article.created_at.utc.to_s(:long) %&gt; (UTC)&lt;/strong&gt; and has &lt;strong&gt;&lt;%= @article.versions_count %&gt; versions&lt;/strong&gt;.&lt;/p
 &lt;p&gt;It has  &lt;span id=&quot;reccounter&lt;%=@va.id %&gt;&quot;&gt;&lt;%= @va.votes %&gt; recommendations&lt;/span&gt; - 
   &lt;span id=&quot;recommend-&lt;%=@va.id %&gt;&quot;&gt;
-    &lt;%= link_to_remote 'Recommend this revision', { :url =&gt; { :controller =&gt; 'news_articles', :action =&gt; 'vote', :id =&gt; @va.id } }, 
+    &lt;%= link_to_remote 'Recommend this revision', { :url =&gt; vote_version_url(@va) }, 
     :title =&gt; &quot;Vote for this revision&quot;  %&gt;.
   &lt;/span&gt;
 &lt;/p&gt;</diff>
      <filename>app/views/versions/diff.html.erb</filename>
    </modified>
    <modified>
      <diff>@@ -5,7 +5,7 @@ ActionController::Routing::Routes.draw do |map|
   map.diff 'articles/:article_id/diff/:version_b/:version_a',
     :controller =&gt; 'versions', :action =&gt; 'diff'
 
-  map.resources :versions
+  map.resources :versions, :member =&gt; { :vote =&gt; :post }
   
   map.resources :articles, :controller =&gt; :news_articles do |article|
     article.resources :versions</diff>
      <filename>config/routes.rb</filename>
    </modified>
    <modified>
      <diff>@@ -9,7 +9,7 @@
 #
 # It's strongly recommended to check this file into your version control system.
 
-ActiveRecord::Schema.define(:version =&gt; 20090628191505) do
+ActiveRecord::Schema.define(:version =&gt; 20090705092959) do
 
   create_table &quot;comments&quot;, :force =&gt; true do |t|
     t.string  &quot;name&quot;,     :limit =&gt; 64
@@ -94,12 +94,10 @@ ActiveRecord::Schema.define(:version =&gt; 20090628191505) do
   create_table &quot;votes&quot;, :force =&gt; true do |t|
     t.string   &quot;sessionid&quot;,   :limit =&gt; 32
     t.datetime &quot;created_at&quot;
-    t.string   &quot;class&quot;,       :limit =&gt; 32
-    t.integer  &quot;relation_id&quot;
+    t.string   &quot;thing_class&quot;, :limit =&gt; 32
+    t.integer  &quot;thing_id&quot;
   end
 
-  add_index &quot;votes&quot;, [&quot;class&quot;], :name =&gt; &quot;votes_class_index&quot;
-  add_index &quot;votes&quot;, [&quot;relation_id&quot;], :name =&gt; &quot;votes_relation_id_index&quot;
-  add_index &quot;votes&quot;, [&quot;sessionid&quot;], :name =&gt; &quot;votes_sessionid_index&quot;
+  add_index &quot;votes&quot;, [&quot;thing_id&quot;, &quot;thing_class&quot;, &quot;sessionid&quot;], :name =&gt; &quot;index_votes_on_thing_id_and_thing_class_and_sessionid&quot;
 
 end</diff>
      <filename>db/schema.rb</filename>
    </modified>
  </modified>
  <removed type="array">
    <removed>
      <filename>app/views/news_articles/vote.rjs</filename>
    </removed>
  </removed>
  <parents type="array">
    <parent>
      <id>8650c61234ec3160e24f5b615ebf0dd6cdbe89be</id>
    </parent>
  </parents>
  <author>
    <name>John Leach</name>
    <email>john@johnleach.co.uk</email>
  </author>
  <url>http://github.com/johnl/news-sniffer/commit/a431bf77fa5dd8394523cc0f53960b3c9384e60d</url>
  <id>a431bf77fa5dd8394523cc0f53960b3c9384e60d</id>
  <committed-date>2009-07-05T10:48:05-07:00</committed-date>
  <authored-date>2009-07-05T10:48:05-07:00</authored-date>
  <message>Updated Vote model to use new Rails features</message>
  <tree>ee9a4f4f3dd69385fbb03a159ff0d8f54a04298a</tree>
  <committer>
    <name>John Leach</name>
    <email>john@johnleach.co.uk</email>
  </committer>
</commit>
