2012-08-10 51 views
1

我有下面的代码在我的Rails 3应用程序控制器:除非Rails控制器中的语句?

def like 
    @suggestion = Suggestion.find(params[:id]) 
    @suggestion.voteip = request.env['REMOTE_ADDR'] 
    @suggestion.update_attribute(:votes, @suggestion.votes + 1) 
    redirect_to suggestions_url 
    end 

    def dislike 
    @suggestion = Suggestion.find(params[:id]) 
    @suggestion.voteip = request.env['REMOTE_ADDR'] 
    @suggestion.update_attribute(:votes, @suggestion.votes - 1) 
    redirect_to suggestions_url 
    end 

正如你可以看到代码递增/递减1投票整数,并增加了用户的IP地址,称为voteip列。

我试图实现的是从同一个IP连续两次投票的简单块。因此,如果例如我的IP是123.123.123.123并且我投了些什么,我就无法再从相同的IP地址对相同的建议(向上或向下)进行投票。

这是一个非常简单,无法靠近速率限制投票的万无一失的方法。虽然在环境中它将被用于它几乎完美!

一旦我有这个工作,我打算为投票时间戳添加另一列,然后我可以做一些事情,例如只允许5分钟后通过同一个IP投票。

任何意见将不胜感激!

回答

1

其中一种方法是找到具有REMOTE_ADDR IP的最后一票。

将此添加到您的控制器中。

def like 
    @suggestion = Suggestion.find(params[:id]) 
    remote_addr = request.env['REMOTE_ADDR'] 

    @last_vote = Suggestion.find_ip(remote_addr).last 

    if @last_vote.created_at < 2.minutes.ago 
    render :text => "get lost" 
    else 
    @suggestion.voteip = remote_addr 
    @suggestion.update_attribute(:votes, @suggestion.votes + 1) 
    redirect_to suggestions_url 
    end 
end 

而在你建议的模型添加此

def self.find_ip(ip) 
    where('voteip = ?', "#{ip}") 
end 

我创建了一个快速的应用程序和测试它,它的工作。当然,您可以将2.minutes.ago更改为任何您想要的时间。

希望这会有所帮助!

+0

我是否认为@ last_vote.created_at可以更改为last_vote.voted_at,如果我创建一个名为voted_at的列?目前唯一与投票表决相关的是投票栏。 – dannymcc 2012-08-10 20:33:24

+0

呃你可以但'@ last_vote'找到由指定IP投票的最后一条建议。然后,如果这个last_vote是在不到2分钟前创建的,那么它会渲染文字说“迷路”或做任何你想要的东西 – 2012-08-10 21:20:20

+0

但是是的,你应该不需要添加另一列我不认为:) – 2012-08-10 21:20:39

1

投票真的是一个单独的资源。特别是如果你想在未来实现一个更强大的系统,你会希望你的选票通过has_many关系成为一个单独的表格。通过这种方式,比较特定IP发生的最后一次投票(用作索引,或者用户可能是user_id进行身份验证时)是非常容易的。此外,您还可以为IP /用户创建投票历史记录。

用户/ IP有许多建议,其中有很多票。只是我的两分钱。