2011-11-02 102 views
3

我正在嘗試允許用戶在線程上進行投票,而無需登錄/註冊以增加用戶參與度。我該怎麼做呢?目前我的當前流程是將選票與訪問者的IP地址綁定,以防止多個選票,但另一個問題是request.remote_ip沒有讓我知道正確的IP(我在學校網絡上)。有什麼建議麼?非常感謝!在線程控制器如何設置不需要用戶登錄的投票行爲?

投票行動

def upvote 
@thread = Thread.find(params[:id]) 
current_user.up_vote(@thread) 
flash[:message] = 'Thanks for voting!' 
respond_to do |format| 
format.html { redirect_to :back } 
    format.js 
    end 

投票路線

resources :threads do 
member do 
    post :upvote 
    post :unvote 
end 
+1

你需要使用cookie /等等。儘管這可能是欺騙性的。沒有實際用戶的可靠民意調查或多或少是不可能的。 –

+0

謝謝你的洞察力戴夫!我不知道 – ahuang7

回答

3

我寫了作爲可投票。

這個gem背後的全部想法是允許任何東西在任何事物上進行投票(所以不像用戶描述的情況那樣難以依賴用戶)。

如果您不想使用IP地址來存儲投票,那麼也許您可以使用與每個會話綁定的唯一ID。這可以投票欺詐,但它可以讓任何人在沒有賬戶的情況下進行投票。

你可以做類似

session[:voting_id] ||= create_unique_voting_id 
voter = VotingSession.find_or_create_by_unique_voting_id(session[:voting_id]) 
voter.likes @thread 

您將需要設置該acts_as_voter並保持了獨特的投票ID的VotingSession模型,但應該是很容易的W /軌道。

希望這有助於

+0

終於搞定了,感謝你的幫助!我已經在下面發佈了我的最終代碼。 – ahuang7

2

完成的代碼

最終,我決定把它綁到用戶的IP地址。

首先你必須創建一個會話模型和數據庫表,然後你創建模型acts_as_voter,並在你的控制器動作中添加以下幾行。

session[:voting_id] = request.remote_ip 
voter = Session.find_or_create_by_ip(session[:voting_id]) 
voter.likes @thread 
+0

因此,如果您已經在網站上爲管理員用戶使用Devise,是否只需要進入Devise已經提供的會話,或者是否需要爲非註冊用戶使用單獨的Sessions模型? –

0

@kyle K:如果您使用的設計,因爲我是,你可以按照下面的鏈接,讓匿名用戶創建行動的guest用戶。

https://github.com/plataformatec/devise/wiki/How-To:-Create-a-guest-user

與上述好處是,你還可以照顧將培植出的guest用戶資源回到實際中籤或者如果guest用戶使用「logging_in」在同一會話中轉換註冊用戶如文章:)

我所做的描述方法是:

voter = current_or_guest_user 
voter.likes @thread 
相關問題