2010-11-29 13 views
39

रूबी में एक पोस्ट शीर्षक को एक स्लॉग में कैसे परिवर्तित करना चाहिए?रूबी पोस्ट शीर्षक स्लग

शीर्षक में कोई वर्ण हो सकता है, लेकिन मैं केवल स्लग [a-z0-9-_] (इसे किसी अन्य वर्ण की अनुमति देने की अनुमति देना चाहिए)?

तो मूल रूप से:

  • सभी पत्र
  • downcase हाइफ़न के रिक्त स्थान को परिवर्तित
  • हटाना असंगत वर्णों
+0

* अतिरिक्त शब्द निकालते हैं, जब शीर्षक एन शब्द – Lassi

उत्तर

71
slug = title.downcase.strip.gsub(' ', '-').gsub(/[^\w-]/, '') 

downcase यह लोअरकेस बनाता है। strip सुनिश्चित करता है कि कोई अग्रणी या पिछला सफेद स्थान नहीं है। पहले gsub हाइफ़न के साथ रिक्त स्थान बदलता है। दूसरा gsub सभी गैर-अल्फा गैर-डैश गैर-अंडरस्कोर वर्णों को हटा देता है (ध्यान दें कि यह सेट \W के बहुत करीब है लेकिन इसमें डैश भी शामिल है, यही कारण है कि यह यहां वर्तनी है)।

+0

आपका चरित्र वर्ग के रूप में अधिक संक्षेप में व्यक्त किया जा सकता से अधिक लंबी है '/ [^ \ w -] /'। –

+0

@Daniel, उस अद्यतन को बनाया। –

+1

धन्यवाद, बेन। मैंने खाते में कुछ और जटिलता जोड़ा। \/और एक पंक्ति में एकाधिक को हटाने के लिए और उन्हें अंत से हटा दें: 'slug = title.strip.downcase.gsub (/ [\ s \। \/\\] /, '-')। gsub (/ [^ \ w -] /, '') .gsub (/ [-_] {2,} /, '-')। gsub (/^[-_] /, '') .gsub (/ [- _] $ /, '') '। मैंने यह समझने के बाद बंद कर दिया कि यह सही साबित करने के लिए जटिल है। इसके अलावा, 'tr'' gsub' से तेज़ है, इसलिए यह करना बेहतर है: 'gsub ('', '-')' 'tr ('', '-')' 'से। – ma11hew28

5

to_slug एक महान रेल प्लगइन है जो फंकी पात्रों सहित बहुत अधिक सब कुछ संभालता है, लेकिन इसका कार्यान्वयन बहुत आसान है। इसे स्ट्रिंग पर चक करें और आपको सॉर्ट किया जाएगा। यहाँ स्रोत नीचे सघन है:

String.class_eval do 
    def to_slug 
    value = self.mb_chars.normalize(:kd).gsub(/[^\x00-\x7F]/n, '').to_s 
    value.gsub!(/[']+/, '') 
    value.gsub!(/\W+/, ' ') 
    value.strip! 
    value.downcase! 
    value.gsub!(' ', '-') 
    value 
    end 
end 
+0

मैं रेल का उपयोग नहीं कर रहा हूं, लेकिन यह जानना अच्छा है। धन्यवाद! – ma11hew28

+4

@ JamieRumbelow- आपके नमूना कोड में एक त्रुटि थी। आपको 'value' को स्पष्ट रूप से वापस करने की आवश्यकता है, क्योंकि .gsub! जब कोई प्रतिस्थापन नहीं किया जाता है तो शून्य वापस आता है (उदा। '" परीक्षण ".to_slug' शून्य वापस आ जाएगा)। मैंने आपके लिए कोड तय किया है। – Yarin

0

मैं FriendlyId, आत्म पेशेवर मल बनाने के "स्विस सेना बुलडोजर" की तरह। https://github.com/norman/friendly_id

+2

इस प्लगइन के साथ, आप अपनी स्ट्रिंग को स्लग करने वाली विधि को कैसे कॉल करते हैं? – Ben

80

क्या यह रेल है?

string.parameterize 

यही है। यहां तक ​​कि अधिक परिष्कृत स्लगिंग के लिए, ActsAsUrl देखें। यह निम्नलिखित कर सकता है:

"rock & roll".to_url => "rock-and-roll" 
"$12 worth of Ruby power".to_url => "12-dollars-worth-of-ruby-power" 
"10% off if you act now".to_url => "10-percent-off-if-you-act-now" 
"kick it en Français".to_url => "kick-it-en-francais" 
"rock it Español style".to_url => "rock-it-espanol-style" 
"tell your readers 你好".to_url => "tell-your-readers-ni-hao" 
+0

यह रेल नहीं है, लेकिन ऐसा लगता है कि मणि सादे रूबी के साथ भी काम करेगा। धन्यवाद! मुझे यह पसंद है कि यह कैसे बदलता है और, लेकिन मैं इसे/और परिवर्तित करना चाहता हूं। सेवा मेरे -। यह क्रमशः उन्हें स्लैश और डॉट में परिवर्तित करता है। इसके अलावा, इस मामले में, चीजों को सरल रखने के लिए, मुझे अतिरिक्त रत्न की आवश्यकता नहीं होगी। इसलिए, मैंने अपना समाधान 'slug = title.strip.downcase.gsub (/ (&|&) /, 'और') .gsub (/ [\ s \। \/\\] /, '-') में अपना समाधान अपडेट किया है। Gsub (/ [^ \ w -] /, '') .gsub (/ [-_] {2,} /, '-')। gsub (/^[-_] /, '') .gsub (/ [ -_] $ /, '') '। – ma11hew28

संबंधित मुद्दे