anonymous user enhancements
parent
25e7cf9024
commit
38c7e0fcef
|
@ -27,7 +27,7 @@ class Votes < Application
|
||||||
@photo = Photo.find params[:photo_id] rescue nil
|
@photo = Photo.find params[:photo_id] rescue nil
|
||||||
@vote = Vote.new :photo_id => (@photo.id rescue true), :vote => (params[:one].to_s == 'true')
|
@vote = Vote.new :photo_id => (@photo.id rescue true), :vote => (params[:one].to_s == 'true')
|
||||||
if logged_in?
|
if logged_in?
|
||||||
@vote.user = current_user
|
@vote.user_id = current_user.id
|
||||||
else
|
else
|
||||||
@vote.session_id = current_user
|
@vote.session_id = current_user
|
||||||
end
|
end
|
||||||
|
@ -37,7 +37,7 @@ class Votes < Application
|
||||||
else
|
else
|
||||||
emsg = "The vote failed: "
|
emsg = "The vote failed: "
|
||||||
@vote.errors.each_full { |e| emsg += e + ' ' }
|
@vote.errors.each_full { |e| emsg += e + ' ' }
|
||||||
render emsg, :status => 401
|
render emsg, :status => 401, :layout => false
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -47,6 +47,8 @@ class Votes < Application
|
||||||
# just a simple check to not allow you to vote on a photo twice. model
|
# 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...
|
# 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.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
|
||||||
end
|
end
|
||||||
|
|
|
@ -2,8 +2,11 @@ class Vote < ActiveRecord::Base
|
||||||
belongs_to :photo
|
belongs_to :photo
|
||||||
belongs_to :user
|
belongs_to :user
|
||||||
|
|
||||||
validate :unique_for_user
|
|
||||||
validates_presence_of :photo_id
|
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 :user_id
|
||||||
attr_protected :session_id
|
attr_protected :session_id
|
||||||
|
@ -46,7 +49,7 @@ class Vote < ActiveRecord::Base
|
||||||
def self.voted_for?(photo, user)
|
def self.voted_for?(photo, user)
|
||||||
c = [ 'photo_id = :pid' ]
|
c = [ 'photo_id = :pid' ]
|
||||||
v = { :pid => (photo.respond_to?('id') ? photo.id : photo) }
|
v = { :pid => (photo.respond_to?('id') ? photo.id : photo) }
|
||||||
if user.respond_to?('id')
|
if user.respond_to?('user_name')
|
||||||
c << 'user_id = :uid'
|
c << 'user_id = :uid'
|
||||||
v[:uid] = user.id
|
v[:uid] = user.id
|
||||||
else
|
else
|
||||||
|
@ -61,7 +64,7 @@ class Vote < ActiveRecord::Base
|
||||||
# photo ids.
|
# photo ids.
|
||||||
#
|
#
|
||||||
def self.voted_photo_ids(user)
|
def self.voted_photo_ids(user)
|
||||||
c = if user.respond_to?('id')
|
c = if user.respond_to?('user_name')
|
||||||
"votes.user_id = #{user.id}"
|
"votes.user_id = #{user.id}"
|
||||||
else
|
else
|
||||||
"votes.session_id = '#{user}'"
|
"votes.session_id = '#{user}'"
|
||||||
|
@ -71,19 +74,6 @@ class Vote < ActiveRecord::Base
|
||||||
|
|
||||||
protected
|
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
|
# Recalc the stats in the Photo for specific stats don't have to query the
|
||||||
# database.
|
# database.
|
||||||
|
|
Reference in New Issue