2012-11-21 10 views
8

मैं एक टिप्पणी मॉडल जहाँ मैं की तरह एक टिप्पणी की अधिकतम लंबाई सीमित है सत्यापित करें:रेल, इनपुट क्षेत्र के maxlength

validates_length_of :comment, :maximum => 500 

मेरी नजर में मैं इनपुट क्षेत्र घोषित किया है:

<%= f.text_area :comment,:as => :text, :maxlength => 500 %> 

इनपुट फ़ील्ड पर सीमा के अनुसार काम करता है, यह अधिकतम 500 वर्णों तक सीमित है।

हालांकि, मॉडल सीमा अपेक्षा के अनुसार काम नहीं करती है। न्यूलाइन के साथ 500 वर्णों का एक पाठ एक सत्यापन त्रुटि देता है। मॉडल न्यूलाइन को दो अक्षरों के रूप में गिना जाता है (और संभवतः अन्य पात्र भी)। तो

इस इनपुट काम करेंगे, कोई नई पंक्तियां:

abc abc abc abc.... 

यह कार्य नहीं करेंगे:

abc 

abc 
. 
. 

वहाँ एक चरित्र के रूप में नई-पंक्तियों (और अन्य) की गणना करने के validates_length_of बनाने के लिए एक आसान तरीका है? ।

=== Result1 ===

मैं जॉन और दारियो से महान जवाब संयुक्त और इस बनाया:

before_validation(:on => :create) do 
    self.comment = comment.gsub("\r\n","\n") if self.comment 
end 

उत्तर

4

ब्राउज़र के रूप में "\ r \ n" प्रभावी ढंग से प्रत्येक textareas से नई-पंक्तियों भेज रेल की डिफ़ॉल्ट लंबाई वैधता

का उपयोग करते समय न्यूलाइन को दो वर्णों के रूप में गिना जाता है, तो या तो नियंत्रक में प्रतिस्थापन विधि बनाएं, या कस्टम लम्बाई सत्यापनकर्ता बनाएं।

4

आप लंबाई वैधता के टोकननाइज़र विकल्प का उपयोग कर सकते हैं, केवल शब्दों को गिनने के लिए, लाइन ब्रेक नहीं।

validates :comment, length: { 
    maximum: 500, 
    tokenizer: lambda { |str| str.scan(/\w+/) } 
} 

अधिक जानकारी के लिए, एक नज़र यहाँ ले: Active Record Validations and Callbacks

1

आप

validates :comment, length: { 
    maximum: 500, 
    tokenizer: lambda { |str| str.scan(/./) } 
} 

इस्तेमाल कर सकते हैं इस तरह से आप वास्तव में स्ट्रिंग आकार जैसा कि आप उम्मीद मिलता है।

यह पाठ क्षेत्र इनपुट:

यह

एक लाइन ब्रेक

इस स्ट्रिंग

की ओर जाता है के साथ एक स्ट्रिंग है "यह एक साथ एक स्ट्रिंग है \ आर \ na लाइन ब्रेक "

डिफ़ॉल्ट प्रति

रेल सत्यापनकर्ता हर किरदार में गिना जाता है और आप regexp साथ tokenizer का उपयोग करते हैं 36

"This is a string with \r\na line break".length 
=> 36 

की लंबाई हो जाता है /./ के रूप में आप (प्रत्येक चरित्र + रिक्त स्थान +1 उम्मीद करेंगे आप 35 का एक परिणाम मिलता है न्यूलाइन) क्योंकि यह \n को पट्टी करता है लेकिन इसके बजाय \r की गणना करता है।

"This is a string with a\r\na line break".scan(/./) 
=> ["T", "h", "i", "s", " ", "i", "s", " ", "a", " ", "s", "t", "r", "i", "n", "g", " ", "w", "i", "t", "h", " ", "a", "\r", "a", " ", "l", "i", "n", "e", " ", "b", "r", "e", "a", "k"] 

"This is a string with \r\na line break".scan(/./).count 
=> 35 

स्ट्रिंग विधि के बारे में अधिक जानकारी scanhttp://ruby-doc.org/core-2.2.0/String.html#method-i-scan

देख regexp अधिक जानकारी के लिए आप http://rubular.com/

साथ एक छोटा सा खेल सकते हैं के लिए
संबंधित मुद्दे