2009-11-20 84 views
3

我是新來的鐵路,所以很容易。我創建了一個能夠通過使用類似於Facebook的「喜歡」功能在帖子上「投票」的博客。我沒有使用任何身份驗證,但希望通過IP限制對特定職位的投票。也就是說,一旦有人投了一個帖子,他們就不能再投票了(除非他們重新設置路由器)。Ruby on Rails - 限制點擊IP

我覺得這應該是我通過修改投票或帖子模型而影響到的東西,但是我擔心它會與Sessions有關,這是......我還沒有任何經驗。

讓我知道你是否需要我發佈任何代碼。這是票控制器。

class VotesController < ApplicationController 

    def create 
    @post = Post.find(params[:post_id]) 
    @vote = @post.votes.create!(params[:vote]) 

     respond_to do |format| 
     format.html { redirect_to @post} 
     format.js 
    end 
    end 
end 

回答

8

這樣做的兩種方式馬上浮現在腦海中,可能還有其他方法。兩者都需要在數據庫中存儲IP。

  1. 阻止使用唯一性驗證創建投票。

    class Vote < ActiveRecord::Base 
        validates_uniqueness_of :ip_address 
        ... 
    end 
    
  2. 塊從控制器被創建的投票

    class VotesConroller < ApplicationController 
        ... 
        def create 
        unless Vote.find_by_post_id_and_ip_address(params[:post_id],request.remote_ip) 
         posts.votes.create!(params[:vote].update({:ip_address => request.remote_ip})) 
        end 
        end 
    end 
    
+0

這是偉大的...我如何將IP地址從表格傳遞給表格。我創建了列ip_address。 – bgadoci 2009-11-20 16:21:53

+0

我試過了:<%= f.hidden_​​field:ip_address => request.remote_ip但沒有奏效。 – bgadoci 2009-11-20 16:22:50

+1

你甚至不需要收集表單中的IP地址。只需讓控制器通過它。有關如何做到這一點,請參閱第二種方法中的Vote.create行。 (假設列名是ip_address – EmFi 2009-11-20 16:25:47

0

你可以一個ip_address屬性添加到您的votesvalidates_uniqueness_of :ip_address以確保只有一票可能來自一個IP。

1

我會做EMFI和bensie都表示和存儲與投票的IP地址,但你可能也想看看創建您想要阻止的IP黑名單,因爲它代表受歡迎的代理服務器(例如,http://proxy.org/列表中的許多代理)。

當你添加到列表中,它會使用戶至少有點難以作弊。

+0

非常感謝,看到我對EmFi的評論,需要一個 – bgadoci 2009-11-20 16:23:50

+0

好的,remote_ip應該使用HTTP \ _CLIENT \ _IP或HTTP \ _X \ _FORWARDED \ _FOR標頭獲取代理IP。 但是,它可能不是完美無瑕的。 – EmFi 2009-11-20 16:31:53