使用cookie限制投票

时间:2011-10-09 22:13:06

标签: ruby-on-rails ruby ruby-on-rails-3 cookies

我希望访问者只能在每个链接上投票一次。我明白,如果他们清除他们的饼干,他们将能够再次投票。我如何在rails中实现此功能?我在下面附上了我的文件。感谢

Controller https://gist.github.com/1274274

查看https://gist.github.com/1274275

2 个答案:

答案 0 :(得分:1)

我不会将它存储在cookie甚至会话中。您应该在votes表中跟踪这些内容,其中包含user_idlink_id

每次用户投票时,检查此表中的记录,如果存在,则抛出错误。如果一个不存在,那么在此表中插入一条记录,并在链表上增加投票数,也许使用计数器缓存。

答案 1 :(得分:0)

我不建议这样做,但如果你坚持我会说你应该根据投票的类型创建一个哈希,链接的ID为键,其值设置为true或false。

我会改变你的控制器:

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

希望有效。