2014-03-25 55 views
0
def show 
    Bottle.increment_counter :views, @bottle 
end 

工作得很好,但是如果同一个人一遍又一遍地看它,它会不断递增。我应该如何解决这个问题,让唯一的命中增加它?创建简单的点击计数器

我应该有一个ip模型,并使我的Bottle模型have_many ips,ips是谁访问它的人?然后,做东西这个? (我提取出来变成一个类的方法,但是这仅仅是给你看):

def show 
    if [email protected]?(request.remote_ip) 
     Bottle.increment_counter :views, @bottle 
     Ip.create(bottle_id: @bottle, ip: request.remote_ip) 
    end 
end 

我觉得上面会的工作,但不会这个结果在数据库中非常迅速填满?或者这是一种习惯,不管?如果这不是一种做法,我怎么能以某种方式对cookie进行同样的操作? cookie的结构是什么?

另外,我知道有一堆命中计数器的宝石,但我想这样做我自己(在您的帮助:P)

回答

0

我将它设置在一个cookie,你可以查看怎么做here。这也允许灵活性,所以如果你想跟踪用户视图,如果他们每周查看一次或其他。

2

有关请求的IP地址的事情是,你可以为每个人都在同一网络中相同的IP地址(这只是你可能会看到的IP地址),即使在内部的网络中,它们各自显然有自己的IP地址。

...在你的控制器

def show 
    # see if they already have a cookie, if so 
    # it will create a cookie with the Hit id you created 
    if cookies.has_key?(:unique_hit_key) 
    hit = Hit.find(cookies[:unique_hit_key]) 
    hit.count = hit.count.to_i+1 
    hit.save 
    else 
    cookies[:unique_hit_key] = { 
     :value => Hit.create(count: 1).id, 
     :expires => 1.year.from_now, 
     :domain => 'domain.com' 
    } 
    end 
end 

这并不追踪IP,但你真的不需要它。如果您没有看到其中的cookie,则会根据您设置的cookie保留所有访问者的人数。这假设松散,你不必担心人们擦掉他们的cookies。如果你需要在这个更好的控制,你需要很可能是通过登录跟踪等

+0

这正是我一直在寻找! – Doctor06