2009-04-07 18 views
11

मेरा आवेदन आतंक विरोधीमैं @ vendor.name को जानकर रेल एसईओ दोस्ताना रूबी पर यूआरएल कैसे बना सकता हूं?

मैं एक कार्रवाई/दृश्य showsummary कहा जाता है जहां आईडी, URL में पारित किया गया है में है, और नियंत्रक इस्तेमाल किया गया है कि दृष्टांत को @vendor जहां @ vendor.name एक कंपनी का नाम है ।

मैं यूआरएल में शोमरी/1/के पास/विक्रेता नाम के बजाय यूआरएल होना चाहता हूं।

मैं यह कैसे कर सकता हूं?

उत्तर

7

इन सभी समाधानों में find_by_name का उपयोग किया जाता है, जो निश्चित रूप से उस कॉलम पर एक अनुक्रमणिका होने की आवश्यकता होती है और आवश्यकता होती है कि वे अद्वितीय हों। एक बेहतर समाधान जिसे हमने उपयोग किया है, सौंदर्य की एक छोटी राशि का त्याग करना, विक्रेता नाम को इसके आईडी के साथ उपसर्ग का उपयोग करना है। इसका मतलब है कि आपके पास अपने नाम कॉलम पर एक अनुक्रमणिका नहीं है और/या विशिष्टता की आवश्यकता है।

vendor.rb

def to_param 
    normalized_name = name.gsub(' ', '-').gsub(/[^a-zA-Z0-9\_\-\.]/, '') 
    "#{self.id}-#{normalized_name}" 
end 

तो यह आप यूआरएल

/1-एक्मे की तरह देना होगा

/19-सेफवे

आदि

फिर अपने शो में

कार्रवाई आप अभी भी

0 का उपयोग कर सकते हैं
Vendor.find(params[:id]) 

कि विधि परोक्ष अपने तर्क पर .to_i फोन करेगा, और इस तरह एक स्ट्रिंग पर to_i बुला हमेशा संख्यात्मक उपसर्ग लौट सकते हैं और उस बिंदु पर शेष पाठ अपने सभी फुलाना छोड़ देंगे के रूप में।

ऊपर मानता है कि आपके /:controller/:action/:id की डिफ़ॉल्ट मार्ग का उपयोग कर रहे हैं, जो अपने यूआरएल

की तरह लग रहे हो जाएगा

/विक्रेताओं/दिखाएँ/1-एक्मे

लेकिन अगर आप चाहते हैं उन्हें सिर्फ देखने के लिए

/1-एक्मे

फिर

map.show_vendor '/:id', :controller => 'vendors', :action => 'show' 
की तरह एक मार्ग है

यह इंगित करेगा कि यह बहुत सारे यूआरएल को निगल देगा जो आप शायद इसे भी नहीं चाहते हैं। चेतावनी लो

+0

हाय पर एक नज़र भी ले लो, इस के लिए धन्यवाद - "यूआरएल के बहुत से निगलने का मतलब क्या है जिसे आप नहीं चाहते हैं?" ओह, तुम्हारा मतलब है कि मार्ग उस नियंत्रक को बुलाए जाने वाले बहुत कुछ को बदल देगा? मैं विक्रेताओं/शो/1-Acme के साथ ठीक हूँ ... यह एसईओ को कैसे प्रभावित करता है? – AFG

+0

हां, '/: आईडी' बहुत सी चीजों से मेल खाएगा, इसलिए आपको '/ about', '/ contact' आदि के लिए कई नामित मार्ग होंगे। एसईओ के लिए, मुझे लगता है कि संख्या उपसर्ग नगण्य है । –

+0

तो मैं विक्रेताओं/सूची के लिए एक नामित मार्ग कैसे बनाऊंगा जो 'सूची' नामक विक्रेता_controller.rb में कार्रवाई के अनुरूप होगा? धन्यवाद। अन्यथा यह अच्छा लग रहा है। – AFG

0

मुझे इसे सही करने के लिए थोड़ा सा प्रयोग करना होगा, लेकिन समाधान के लिए दो प्राथमिक भाग हैं।

1) एक मार्ग जोड़ें। कॉन्फ़िगर/मार्गों में, एक पंक्ति जोड़ें जो फॉर्म बेसरल/नियंत्रक /: विक्रेता नाम को कार्रवाई शोमरी, (या शायद एक नई कार्रवाई, show_summary_by_vendor_name) पर अनुरोध भेजती है [यदि आप बेसूर /: vendorname का उपयोग करने की योजना बना रहे हैं , यह भी ठीक है] सुविधा के लिए, सुनिश्चित करें कि पैरामीटर कुछ ऐसा है: विक्रेता नाम, डिफ़ॉल्ट नहीं: आईडी

2) नियंत्रक कार्रवाई लिखें। नियंत्रक फ़ाइल में, या तो आईडी के साथ या vendorname के साथ कहा जाता है या सिर्फ एक show_summary_by_vendor_name लिखने के आधार पर अलग-अलग करने के लिए अपनी शोमरी कार्रवाई को संपादित करें। (सर्वोत्तम प्रथाओं के आधार पर, और आपने 1 में किस मार्ग को लिखा था। मुझे अपने सिर के शीर्ष से पता नहीं है जो बेहतर है) आप @vendor = Vendors.find_by_name (पैराम्स [: विक्रेता_नाम]) या ऐसा कुछ, और उसके बाद नियमित रूप से शोमेरी में जिस तरह से आप इसे प्रस्तुत करेंगे।

3) लिंक के रूप में इसका उपयोग करें। एक बार जब आप पुष्टि करते हैं कि बेसुरल [/ नियंत्रक?]/विक्रेता-नाम काम करता है, और सारांश दिखाता है, तो सुनिश्चित करें कि आपके एप्लिकेशन में और अन्य जगहों के सभी लिंक, उस लिंक का उपयोग करें। मेरे सिर के ऊपर से, मुझे याद नहीं है कि लिंक_to में एक कस्टम मार्ग को एकीकृत करना कितना मुश्किल है, लेकिन मुझे लगता है कि यह करने योग्य है। अधिकतर खोज इंजन [google] लिंक पर भारी भरोसा करते हैं, इसलिए अच्छा एसईओ आपको उन नामित लिंक का उपयोग करेगा, संख्याबद्ध नहीं। मुझे लगता है। मैं एसईओ के बारे में ज्यादा नहीं जानता।

3

इस विषय पर रयान बेट्स के पास screencast है।

मूल रूप से आप विक्रेता मॉडल में to_param विधि अधिभारित करते हैं।

def to_param 
    permalink 
    end 

फिर जब आप अपने नियंत्रक में संसाधन को देखने के आप कुछ इस तरह करते हैं:

@vender = Vender.find_by_name(params[:id]) 

लेकिन इस के साथ समस्या यह है कि आप यह सुनिश्चित करें कि विक्रेताओं के नाम हैं बनाने के लिए होगा है अद्वितीय। यदि वे तब अन्य समाधान नहीं कर सकते हैं जो रयान बताती है कि वह आईडी को नाम पर कहां से प्रीपेड करता है और उसके बाद परिणाम आईडी को आइटम आईडी ढूंढने के लिए पार्स करता है।

1

आप उन यूआरएल तक पहुंचने के लिए उपयोग किए जाने वाले मार्गों को संशोधित करके और उन्हें उपयोग करने के लिए बदलने के द्वारा ऐसा करते हैं: आईडी, बजाय आईडी:। इसका शायद अर्थ होगा कि संसाधनों पर भरोसा करने के बजाय आपको खुद को मार्ग लिखना होगा।

उदाहरण के लिए इसे मार्गों में जोड़ें।rb फ़ाइल:

map.with_options :controller => "vendor" do |vendor| 
    vendor.connect "/vendor/:name", :action => "show" 
    # more routes here for update, delete, new, etc as required 
end 

अन्य परिवर्तन यह है कि आवश्यक हो जाएगा कि अब आप नाम नहीं आईडी द्वारा डेटाबेस में विक्रेता वस्तु को ढूंढना होगा, इसलिए: आंतरिक

@vendor = Vendor.find_by_name(params[:name]) 

(कम से कम मेरे ज्ञान/प्रयोग के लिए) जो भी पैरामीटर नाम मार्ग के यूआरएल भाग में निर्दिष्ट नहीं है (यानी "नियंत्रक/क्रिया/आईडी" भाग के भीतर नहीं) पैरामीटर के रूप में अंत तक निपटाया जाता है।

6

मैंने सोचा कि मैं टैग किए गए उत्तर के पूरक के रूप में स्ट्रिंग # पैरामीटर का उल्लेख करूंगा।

def to_param 
    "#{id}-#{name.parameterize}" 
end 

यह हाइफ़न पात्रों को फ़िल्टर, डैश आदि के साथ रिक्त स्थान से बदल देंगे

+0

की बजाय स्ट्रिंग # पैरामीटर (ActiveSupport) का उपयोग करें जो दिलचस्प है ... कोई डाउनसाइड्स? – AFG

+0

सबकुछ डाउनसाइड्स है! एक हो सकता है कि यदि 'नाम' विशेषता बदलती है तो लिंक स्वचालित रूप से बदल जाएगा, जिसे आप डेटाबेस में एक अलग विशेषता में परमालिंक को स्टोर करते समय अधिक सटीक रूप से नियंत्रित किया जा सकता है। –

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