2011-06-23 25 views
0

我有一個數據庫,其中包含多個記錄,每個記錄都有一個關聯的URL。目前我已經設置了一些東西,以便當用戶點擊特定記錄的鏈接時,他們會被重定向到相應的URL。該代碼是目前:問題統計在Rails中單擊鏈接的次數

<%= link_to image_tag(alldata.picture.to_s + ".gif"), alldata.URL_link %> 

這工作很好。我想現在修改這個,所以當鏈接被點擊時,一個名爲:click_count的參數對於所有記錄都被設置爲0。

讀書的時候,我相信你能做到這一點使用下面的內容形式:

<%= link_to image_tag(alldata.picture.to_s + ".gif"), alldata.URL_link, {:controller => params[:controller], :action => "clickcountplusone", :product_name => alldata.product_name} %> 

與控制器如下:

def clickcountplusone 
    clickeditem = Entiredatabase.find(params[:product_name]) 
    clickeditem.update_attribute(:click_count => clickeditem.click_count + 1) 
end 

雖然這不會產生一個錯誤,它也不會增加計數...任何人都可以解決這個問題?

+0

我深信:動作命令不應該加引號,但不知道在哪裏,我需要來定義函數... – Texas

回答

0

您對update_attribute sintax是錯誤的:

clickeditem.update_attribute(:click_count => clickeditem.click_count + 1) 

應該是:

clickeditem.update_attribute(:click_count, clickeditem.click_count + 1) 

要當心,update_attribute收到(name, value)update_attributes收到hash。更多信息here

也看看到increment counter

Item.increment_counter(:click_count, @item.id) 
+0

感謝這個,使用你的建議肯定看起來更有希望。我已經把def語句放在了application_helper中。但是,我遇到了Frankie發現的問題,代碼嘗試在頁面加載後立即運行。只需添加:from_link => true似乎不能解決問題。該鏈接實際上是一個外部網站,所以我無法按照他的建議將代碼放入Show方法中。除非單擊鏈接,否則是否有停止運行代碼的方法? – Texas

+1

您可以創建'show'方法,並在那裏遞增計數器並重定向到外部URL,因此當用戶單擊鏈接時,它將被服務器重定向到URL。當點擊鏈接時也可以使用javascript向服務器發送請求。 – JCorcuera

1

你不應該爲此需要單獨的操作。相反,使用默認的show行動,並增加每次動作被稱爲櫃檯,像這樣:

def show 
    @item = Item.find(params[:id]) 
    Item.increment_counter(:views, @item.id) 
end 

然而,這將增加每當用戶瀏覽網頁計數器 - 所以,如果你想只跟蹤觀點,即遵循特定的鏈接,你可以這樣做:

def show 
    @item = Item.find(params[:id]) 
    if params[:from_link] 
    Item.increment_counter(:views, @item.id) 
    end 
end 

然後在您的link_to助手,增加一個額外的PARAM:

link_to(image_tag("blah.jpg"), item_path, {:from_link => true} 

希望這有助於。