2010-04-08 47 views
6

我在網站上有一個應限制長度的文本區域。在JavaScript和Ruby on Rails中計算字符串長度

我允許用戶輸入255個字符,並正在實施的是限制了Rails的驗證:

validates_length_of :body, :maximum => 255 

與此同時,我加了一個javascript字符計數器就像你在Twitter上看到,給反饋給用戶的,他有多少個字符已被使用,並禁用時,在長度提交按鈕,和我得到的Javascript那個長度,像這樣的電話:

element.length 

最後,爲了保持數據完整性,在我的Postgres數據庫中,我創建了這個字段一個varchar(255)作爲最後一道防線。

不幸的是,這些計數字符的方法似乎並不直接兼容。 Javascript計數最好,因爲它計算了用戶認爲所有內容都是單個字符的字符數。但是,一旦提交到Rails,所有的回車已經被轉換爲\ r \ n,現在佔用2個字符的空間,這使得關閉調用失敗Rails驗證。即使我要在Rails中手動編寫不同長度的驗證碼,它仍然會在遇到數據庫時失敗,儘管我還沒有證實。

對於我來說,使所有這些工作按照用戶的想法工作的最佳方式是什麼?

最佳解決方案:使我能夠滿足用戶期望的方法,其中任何類型的每個字符只有一個字符。如果這意味着增加varchar數據庫字段的長度,用戶就不應該偷偷發送一個手工製作的帖子,該帖子會創建一個超過255個字母的行。

有點可接受的解決方案:一個ja​​vascript的變化,使用戶能夠看到真實的字符數,例如一次處理2個字符的回車增量,同時正確處理所有可能具有這些奇怪行爲的符號。

回答

0

我建議存儲數據與CR-LF轉換爲單個LF。擺脫rails驗證,因爲當數據庫字段已設置寬度時,這是不需要的。相反,在存儲之前,Rails會將CRLF轉換爲LF。

+1

但是CR-LF是我需要注意的唯一特殊字符,還是可能存在觸發它的其他事物?此外,仍然需要Rails驗證,以便在出現問題時向用戶顯示好的消息。 – 2010-04-08 18:27:09

+0

如果您已經將數據庫和HTML設置爲UTF-8編碼,那麼您不應該有任何其他問題。忘記漂亮的消息,因爲它們永遠不會顯示 - 您的客戶端JavaScript不會允許提交太長的數據。對於禁用JavaScript的用戶有0.01%是不值得的。 – Tometzky 2010-04-08 19:37:29

+1

如果沒有Rails驗證,數據庫會自動截斷字符串,用戶永遠不會知道它。這是應該避免的反模式。 – 2011-04-15 15:32:11