anonymous user enhancements

master
Coleman 2008-10-17 17:03:28 -05:00
parent 25e7cf9024
commit 38c7e0fcef
2 changed files with 11 additions and 19 deletions

View File

@ -27,7 +27,7 @@ class Votes < Application
@photo = Photo.find params[:photo_id] rescue nil
@vote = Vote.new :photo_id => (@photo.id rescue true), :vote => (params[:one].to_s == 'true')
if logged_in?
@vote.user = current_user
@vote.user_id = current_user.id
else
@vote.session_id = current_user
end
@ -37,7 +37,7 @@ class Votes < Application
else
emsg = "The vote failed: "
@vote.errors.each_full { |e| emsg += e + ' ' }
render emsg, :status => 401
render emsg, :status => 401, :layout => false
end
end
@ -47,6 +47,8 @@ class Votes < Application
# just a simple check to not allow you to vote on a photo twice. model
# business logic will fail this, too, but just to make sure you don't...
@photo = Photo.find params[:photo_id] if params[:photo_id]
@photo = Photo.next_available_votable_photo current_user if @photo.nil? or (logged_in? and current_user.voted_for?(@photo))
if @photo.nil? or Vote.voted_for?(@photo, current_user)
@photo = Photo.next_available_votable_photo current_user
end
end
end

View File

@ -2,8 +2,11 @@ class Vote < ActiveRecord::Base
belongs_to :photo
belongs_to :user
validate :unique_for_user
validates_presence_of :photo_id
validates_uniqueness_of :user_id, :scope => :photo_id
validates_uniqueness_of :session_id, :scope => :photo_id
validates_presence_of :session_id, :if => lambda { |x| x.user_id.to_s.empty? }
validates_presence_of :user_id, :if => lambda { |x| x.session_id.to_s.empty? }
attr_protected :user_id
attr_protected :session_id
@ -46,7 +49,7 @@ class Vote < ActiveRecord::Base
def self.voted_for?(photo, user)
c = [ 'photo_id = :pid' ]
v = { :pid => (photo.respond_to?('id') ? photo.id : photo) }
if user.respond_to?('id')
if user.respond_to?('user_name')
c << 'user_id = :uid'
v[:uid] = user.id
else
@ -61,7 +64,7 @@ class Vote < ActiveRecord::Base
# photo ids.
#
def self.voted_photo_ids(user)
c = if user.respond_to?('id')
c = if user.respond_to?('user_name')
"votes.user_id = #{user.id}"
else
"votes.session_id = '#{user}'"
@ -71,19 +74,6 @@ class Vote < ActiveRecord::Base
protected
##
# Make sure you can't vote on a photo more than once.
#
def unique_for_user
if self.user.to_s.empty? and self.session_id.empty?
self.errors.add(:vote, 'must have an owner')
elsif self.user and Vote.voted_for?(self.photo, self.user)
self.errors.add(:vote, 'has already been collected for this photo')
elsif self.session_id and Vote.voted_for?(self.photo, self.session_id)
self.errors.add(:anonymous, 'vote has already been collected')
end
end
##
# Recalc the stats in the Photo for specific stats don't have to query the
# database.