2010-12-17 16 views
11

का उपयोग करके सहेजने से पहले अंतरिक्ष को बदलें, मैं डेटाबेस में एक नाम सहेजने की कोशिश कर रहा हूं और एक शब्द (पहला नाम) ठीक काम करता है लेकिन जब उपयोगकर्ता पहले नाम और अंतिम नाम दोनों दर्ज करता है, तो मैं रेल को डेटाबेस में सहेजना चाहता हूं प्रथम नाम अंतिम नाम (प्रथम के बीच स्थान) के बजाय firstname-lastname।रेल 3

मुझे पता है कि मुझे शायद फ़िल्टर बनाने से पहले उपयोग करना चाहिए, लेकिन मुझे यकीन नहीं है कि इसे कैसा दिखने की आवश्यकता है। मैं काम करने के लिए सत्यापन चाहता हूं, यानी दो लोगों को एक ही नाम का उपयोग करने में सक्षम होना चाहिए। रेल

मैं उपयोग कर रहा हूँ 3.

उत्तर

3

आप क्यों नहीं बस DB में first_name और last_name कॉलम नहीं है, और यह सुनिश्चित करना अपने स्वयं के सत्यापन नियम http बनाने संयोजन अद्वितीय है (: //guides.rubyonrails .org/active_record_validations_callbacks.html # बनाने-कस्टम मान्यता-तरीकों)। आपको अपने डीबी में उन दो स्तंभों पर एक अद्वितीय अनुक्रमणिका भी बनाना चाहिए।

0

एक और विकल्प हमारे साथ सभी मौजूदा रिक्त स्थान को regexp और प्रतिस्थापित करना होगा। आप इस मॉडल के साथ कुछ डाल देंगे:

self.firstname.gsub(/\s+/, '-') 

आपके मॉडल में।

नोट: मुझे यकीन नहीं है कि रूबी \s को "किसी भी सफेद जगह" के रूप में स्वीकार करता है और मुझे लगता है कि * यह सुनिश्चित करना चाहिए कि अगर कोई दो पड़ोसी रिक्त स्थान (या अधिक) के साथ नाम दर्ज करता है तो यह प्रत्येक स्थान को परिवर्तित नहीं करेगा एक अलग डैश में, लेकिन केवल एक में।

+0

यह एक पानी का छींटा, नहीं हर शब्द ... – Ger

+0

@ गीरॉइड ओह साथ सभी पत्र अलग, आप सही कर रहे हैं! मेरा मतलब '+' '' '' टाइप नहीं था! उसके लिए माफ़ करना। = P – omninonsense

28

आप स्ट्रिंग पर ActiveSupport की इन्फलेक्टर विधि parameterize का उपयोग कर सकते हैं।

name = 'john smith'  # => john smith 
name.parameterize  # => john-smith 

इसके अलावा, parameterize, शब्द-तोड़ के लिए उपयोग करने का विकल्प लेता है ताकि आप इस तरह एक अंडरस्कोर से पानी का छींटा की जगह ले सकता:

name.parameterize("_") # => john_smith 

parameterize का उपयोग करने का एक लाभ यह है कि यह सामान्य हो लैटिन वर्णों, तो ...

name = "jöhanne såltveç" 
name.parameterize  # => johanne-saltvec