我希望访问者只能对每个链接进行一次投票。我明白,如果他们清除了他们的cookies,他们将能够再次投票。我将如何在轨道中实现此功能?下面附上了我的文件。由于使用Cookie限制投票
控制器https://gist.github.com/1274274
查看https://gist.github.com/1274275
我希望访问者只能对每个链接进行一次投票。我明白,如果他们清除了他们的cookies,他们将能够再次投票。我将如何在轨道中实现此功能?下面附上了我的文件。由于使用Cookie限制投票
控制器https://gist.github.com/1274274
查看https://gist.github.com/1274275
我不建议做这种方式,但如果你坚持,我会说,你应该创建一个链接作为按键的识别码与它们的值设置为一个哈希根据投票类型是真是假。
我会改变你的控制器是这样的:
def up
@link = Link.find(params[:id])
session[:voting] ||= {}
unless session[:voting][@link.id]
if session[:voting][@link.id].nil?
points = 1
else
points = 2
@link.update_attribute :points, @link.points + points
session[:voting][@link.id] = true
end
redirect_to :action => :index
end
def down
@link = Link.find(params[:id])
session[:voting] ||= {}
unless session[:voting][@link.id] == false
if session[:voting][@link.id]
points = 2
else
points = 1
@link.update_attribute :points, @link.points - points
session[:voting][@link.id] = false
end
redirect_to :action => :index
end
这个逻辑应该属于模型,但我们不应该访问模型内的会话变量。您可以在模型中重构此代码,并将该会话从控制器传递给它。这将是这样的:
def vote type, session
return if session[:voting][id] == type
added_points = session[:voting][id].nil? ? 1 : 2
update_attribute :points, points + (type ? added_points: -added_points)
session[:voting][id] = type
end
查找更多关于会议在这里: http://guides.rubyonrails.org/action_controller_overview.html#session
希望工程。
我不会把它存储在cookies或甚至会话中。您应该在votes
表中追踪这些表,其中包含user_id
和link_id
。
每次用户投票时,请检查此表中的记录,如果存在则记录错误。如果其中一个不存在,则向该表中插入一条记录并增加链接表上的投票计数,可能使用计数器缓存。
谢谢瑞恩,如果我不想注册必要,你会如何建议跟踪投票? IP? – Dru
@Dru:是的IP会很好。如果人们拥有动态的IP地址,那么无法完全停止。 –
这不起作用,就好像有人清除了他们的会话然后他们可以再次投票。 –
我知道。但他说:“我明白,如果他们清除他们的cookies,他们将能够再次投票。” – adeandrade
我了解使用cookie的含义。谢谢adeandrade,我会采用您的建议并使用Cookie以外的其他方法跟踪投票。 – Dru