我寫了一個計時卡應用程序,我有一個頁面,人們可以「進出」。每個人都有一個按鈕,可以通過Ajax回撥來改變他們的狀態。一些人已經發現,連續點擊一個人的按鈕是很有趣的,所以時鐘輸入/輸出時間的報告頁面變得非常愚蠢。如何限制Rails應用程序中的鼠標點擊率?
我想在打孔頁面中放置一個簡單的Javascript函數,這會將頁面的「可點擊性」限制爲每5秒一次。我在這裏發現了幾個otherthreads在這裏談論類似的東西,但我不知道JS如何將這些建議轉化爲Rails如何進行Ajax調用。
我寫了一個計時卡應用程序,我有一個頁面,人們可以「進出」。每個人都有一個按鈕,可以通過Ajax回撥來改變他們的狀態。一些人已經發現,連續點擊一個人的按鈕是很有趣的,所以時鐘輸入/輸出時間的報告頁面變得非常愚蠢。如何限制Rails應用程序中的鼠標點擊率?
我想在打孔頁面中放置一個簡單的Javascript函數,這會將頁面的「可點擊性」限制爲每5秒一次。我在這裏發現了幾個otherthreads在這裏談論類似的東西,但我不知道JS如何將這些建議轉化爲Rails如何進行Ajax調用。
難道你檢查你的記錄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
完美。我不知道'updated_at'驗證。 – 2011-06-04 09:30:18
好吧,這不是一個真正的'updated_at'驗證 - 它只是一個自定義驗證,它依賴於rails維護的'updated_at'字段。這有意義嗎? :) – jerhinesmith 2011-06-04 21:39:50
啊。細微的區別。我現在看到它。 – 2011-06-05 01:34:05
http://api.rubyonrails.org/classes/ActionView/Helpers/UrlHelper.html#method-i-button_to
選項:禁用,與
您可以禁用一個onclick事件後的按鈕。用戶用戶將不得不重新加載頁面以重新點擊。否則,你需要一些JS在超時後重新啓用。
無論如何,這一個對我來說實際上很有趣,因爲我的「衝牀」頁面每隔一小段JS腳本重新加載反正15秒。 – 2011-06-04 09:34:03
# 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", '')
如果你想讓某人失望,那麼至少應該解釋一下爲什麼。以匿名方式匿名和默默幫助無人幫助。 @clyfe,你可能會被低估,因爲這隻會按照每個請求工作,並且以這種方式將整個JS塊嵌入到link_to中並不是很好維護。您應該將JavaScript保存在單獨的文件中,並且只能引用事件處理程序屬性中的函數/方法。既然你使用jQuery,你甚至可以讓jQuery將事件綁定到你的鏈接而不會污染你的標記。 – d11wtq 2011-06-02 23:39:29
確實!該示例僅用於說明目的。如果「忙」標誌還沒有過期,這個想法是防止事件的默認行爲。 – clyfe 2011-06-03 17:25:16
好吧,爲了公平起見,這個_does_回答瞭如何通過搜索Google搜索答案來獲得JS代碼的問題,因此您可以從我這裏得到一個贊成,只是爲了':onclick'參數。 – 2011-06-04 09:32:33
嗯,有幾種可能性;取決於你想要多少控制。
首先,您可以限制JS的請求頻率。如前面提到的。 此外,你可以使它成爲模型邏輯的一部分,不接受在一定時間內更新(前面也提到過)
我的建議是速率限制每個用戶的請求。有一個很好的機架中間件:http://datagraph.rubyforge.org/rack-throttle/。如果需要,您可以添加自定義設置,但這是我認爲的一個好開始。
偉大的資源,謝謝 – apneadiving 2011-06-02 21:23:51
最完整的答案,但比我需要更多的開銷。 – 2011-06-04 09:29:48
爲什麼你不凍結點擊事件,直到你從服務器得到答案? – apneadiving 2011-06-02 20:56:53
:disable_with? http://api.rubyonrails.org/classes/ActionView/Helpers/FormTagHelper.html#method-i-submit_tag – 2011-06-02 21:00:10