2012-01-03 32 views
4

我使用下面的驗證,以算在軌字計數的話(我從Rails的文檔的例子),但它不是真正的準確:在軌驗證

validates :body, :length => { 
    :minimum => 50, 
    :maximum => 300, 
    :tokenizer => lambda { |str| str.scan(/\w+/) }, 
    :too_short => "must have at least %{count} words", 
    :too_long => "must have at most %{count} words" 
    } 

用戶嘗試發佈這是291字(這是Word給出的數字),它被拒絕的時間太長。我不知道正在使用的表達式有什麼問題,或者確定一個準確的字數可能是一個很好的表達方式。

+0

難道他們剪切和粘貼,或交的純文本?你有數字嗎?這應該非常接近。你可以試試'/ \ S + /',希望如果有特殊字符,它們就會被包含在這個單詞中 - 可能'/ \ w + /'在Word的特殊字符(智能引號等)上窒息。我想編碼可能很重要;不確定。 – 2012-01-03 00:38:47

+0

是的,這可能是一個剪切和粘貼的工作,但我嘗試了純文本,它仍然計算了14個額外的單詞 - 他有很多引號。我用'/ \ b \ S + \ b /'去了,現在看來它工作得相當準確。 – Slick23 2012-01-03 00:44:15

+0

跟進有什麼問題會很有趣;你可以創建一個簡短的已知錯誤的字符串,並查看'scan'實際創建的內容 - 我不確定爲什麼會這樣做。 – 2012-01-03 00:51:54

回答

4

除了掃描/ \ w + /之外,您應該掃描/ \ s + | $ /並將最大值減一,因爲\ w字詞字符匹配對於不常見的字符可能是意外的,因爲只有A-Za-z0-9_ - 有效。

+1

值得注意的是,如果您需要使用posix字符屬性來處理超出標準ASCII字符的東西,那麼應該使用posix字符屬性。這裏是我使用的正則表達式/ \ p {Space} + | $ /,它給了我完整的UTF-8支持。 – joshuacronemeyer 2013-01-27 07:32:19

1

你可以試試:

:tokenizer => lambda { |str| str.split }