2011-06-02 85 views
2

我寫了一個計時卡應用程序,我有一個頁面,人們可以「進出」。每個人都有一個按鈕,可以通過Ajax回撥來改變他們的狀態。一些人已經發現,連續點擊一個人的按鈕是很有趣的,所以時鐘輸入/輸出時間的報告頁面變得非常愚蠢。如何限制Rails應用程序中的鼠標點擊率?

我想在打孔頁面中放置一個簡單的Javascript函數,這會將頁面的「可點擊性」限制爲每5秒一次。我在這裏發現了幾個otherthreads在這裏談論類似的東西,但我不知道JS如何將這些建議轉化爲Rails如何進行Ajax調用。

+2

爲什麼你不凍結點擊事件,直到你從服務器得到答案? – apneadiving 2011-06-02 20:56:53

+0

:disable_with? http://api.rubyonrails.org/classes/ActionView/Helpers/FormTagHelper.html#method-i-submit_tag – 2011-06-02 21:00:10

回答

2

難道你檢查你的記錄updated_at場?它不會限制「鼠標」點擊率,但它會使您的記錄每分鐘/小時多次更新超過x

例如,在你的模型,你可以有這樣的:

class TimeRecord < ActiveRecord::Base 
    validate :throttled_updates, on: :update 

    private 
    def throttled_updates 
    errors.add(:updated_at, "must be more than 5 minutes ago") if self.updated_at < 5.minutes.ago 
    end 
end 
+0

完美。我不知道'updated_at'驗證。 – 2011-06-04 09:30:18

+0

好吧,這不是一個真正的'updated_at'驗證 - 它只是一個自定義驗證,它依賴於rails維護的'updated_at'字段。這有意義嗎? :) – jerhinesmith 2011-06-04 21:39:50

+0

啊。細微的區別。我現在看到它。 – 2011-06-05 01:34:05

1

http://api.rubyonrails.org/classes/ActionView/Helpers/UrlHelper.html#method-i-button_to

選項:禁用,與

您可以禁用一個onclick事件後的按鈕。用戶用戶將不得不重新加載頁面以重新點擊。否則,你需要一些JS在超時後重新啓用。

+0

無論如何,這一個對我來說實際上很有趣,因爲我的「衝牀」頁面每隔一小段JS腳本重新加載反正15秒。 – 2011-06-04 09:34:03

0
# assumes you use jQuery 
link_to 'Toggle', toggle_path, :remote => true, :onclick => ' 
    var e = $(this); 
    if(e.data("busy") == "yes"){ 
     return false; 
    } else { 
     e.data("busy", "yes"); 
     setTimeout(function(){ 
      e.data("busy", "no"); 
     }, 5000); 
    } 
    '.gsub("\n", '') 

檢查http://jsfiddle.net/u42gQ/1/

+0

如果你想讓某人失望,那麼至少應該解釋一下爲什麼。以匿名方式匿名和默默幫助無人幫助。 @clyfe,你可能會被低估,因爲這隻會按照每個請求工作,並且以這種方式將整個JS塊嵌入到link_to中並不是很好維護。您應該將JavaScript保存在單獨的文件中,並且只能引用事件處理程序屬性中的函數/方法。既然你使用jQuery,你甚至可以讓jQuery將事件綁定到你的鏈接而不會污染你的標記。 – d11wtq 2011-06-02 23:39:29

+0

確實!該示例僅用於說明目的。如果「忙」標誌還沒有過期,這個想法是防止事件的默認行爲。 – clyfe 2011-06-03 17:25:16

+0

好吧,爲了公平起見,這個_does_回答瞭如何通過搜索Google搜索答案來獲得JS代碼的問題,因此您可以從我這裏得到一個贊成,只是爲了':onclick'參數。 – 2011-06-04 09:32:33

3

嗯,有幾種可能性;取決於你想要多少控制。

首先,您可以限制JS的請求頻率。如前面提到的。 此外,你可以使它成爲模型邏輯的一部分,不接受在一定時間內更新(前面也提到過)

我的建議是速率限制每個用戶的請求。有一個很好的機架中間件:http://datagraph.rubyforge.org/rack-throttle/。如果需要,您可以添加自定義設置,但這是我認爲的一個好開始。

+0

偉大的資源,謝謝 – apneadiving 2011-06-02 21:23:51

+0

最完整的答案,但比我需要更多的開銷。 – 2011-06-04 09:29:48

相關問題