2011-11-02 103 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 
相关问题