2010-01-08 12 views
6

मैं एक ब्लॉग संसाधन के साथ एक blogs_controller मिल गया है, इसलिए इस प्रकार मैं अभी अपने ठेठ मार्गों मिल गया है:रेलवे में मार्गों/ब्लॉग/वर्ष:/माह/दिन /: परमालिंक "करने का सबसे अच्छा तरीका है?

/blogs/new 
/blogs/1 
/blogs/1/edit #etc 

लेकिन यहाँ है कि मैं क्या चाहता हूँ:

/blogs/new 
/blogs/2010/01/08/1-to_param-or-something 
/blogs/2010/01/08/1-to_param-or-something/edit #etc 
... 
/blogs/2010/01 # all posts for January 2010, but how to specify custom action? 

मुझे पता है कि मैं map.resources और map.connect के संयोजन के साथ ऐसा कर सकते हैं, लेकिन मेरे पास बहुत सारे विचार हैं जो "new_blog_path" आदि के माध्यम से अन्य पृष्ठों से लिंक करते हैं और मैं उन लोगों को जाना और संपादित नहीं करना चाहता हूं। क्या यह अकेले map.resources के साथ संभव है? यह आसान नहीं हो सकता है, लेकिन मैं चालाक होने के खिलाफ नहीं हूँ। मैं की तरह कुछ के बारे में सोच रहा था:

map.resources :blogs, :path_prefix => ':year/:month/:day', :requirements => {:year => /\d{4}/, :month => /\d{1,2}/, :day => /\d{1,2}/} 

लेकिन मुझे यकीन है कि कैसे इस तरह के कार्यों के साथ काम करता नहीं हूँ 'नए' या 'बनाने', और यह भी के बीच में ब्लॉग के साथ /2010/01/08/blogs/1-to_param-etc की तरह एक मार्ग मुझे देता है यूआरएल।

तो, क्या कोई चालाक समाधान है जो मुझे याद आ रहा है, या मुझे नक्शा देखने की ज़रूरत है। कनेक्ट मार्ग?

उत्तर

13

मैं हाल ही में एक ही मुद्दे में भाग गया, और, जबकि यह आपके लिए क्या देख रहे हैं नहीं हो सकता है, यह क्या मैं इसके बारे में देखभाल करने के लिए किया है है :

map.entry_permalink 'blog/:year/:month/:day/:slug', 
        :controller => 'blog_entries', 
        :action  => 'show', 
        :year  => /(19|20)\d{2}/, 
        :month  => /[01]?\d/, 
        :day  => /[0-3]?\d/ 

blog_entries_controller.rb:

def show 
    @blog_entry = BlogEntry.find_by_permalink(params[:slug]) 
end 

blog_entries_helper.rb:

def entry_permalink(e) 
    d = e.created_at 
    entry_permalink_path :year => d.year, :month => d.month, :day => d.day, :slug => e.permalink 
end 

_entry.html.erb:

<h2><%= link_to(entry.title, entry_permalink(entry)) %></h2> 

और पूर्णता के लिए के लिए:

blog_entry.rb:

before_save :create_permalink 

#... 

private 

def create_permalink 
    self.permalink = title.to_url 
end 

#to_url विधि rsl के Stringex से आता है।

मैं अभी भी रेल (और प्रोग्रामिंग) के लिए नया हूं, लेकिन यह शायद इसके बारे में जाने का सबसे आसान तरीका है। यह चीजों के बारे में जाने का एक शानदार तरीका नहीं है, इसलिए दुर्भाग्यवश, आपको map.resources का लाभ नहीं मिलता है।

मुझे यकीन नहीं है (क्योंकि मैंने इसे आजमाया नहीं है), लेकिन आप blog_path, et al के लिए डिफ़ॉल्ट रूट हेल्पर्स को ओवरराइड करने के लिए application_helper.rb में उपयुक्त सहायक बनाने में सक्षम हो सकते हैं। यदि यह काम करता है, तो आपको अपना कोई भी व्यू कोड नहीं बदलना होगा।

यदि आप साहसी महसूस कर रहे हैं, तो आप Routing Filter देख सकते हैं। मैंने इसका इस्तेमाल करने पर विचार किया, लेकिन ऐसा लगता है कि इस काम के लिए ओवरकिल है।

इसके अलावा, जैसा कि आप जानते नहीं हैं, दो बातें आप स्क्रिप्ट/कंसोल के भीतर से अपने मार्गों/पथ का परीक्षण करने के कर सकते हैं:

rs = ActionController::Routing::Routes 
rs.recognize_path '/blog/2010/1/10/entry-title' 

और

app.blog_entry_path(@entry) 

गुड लक!

+0

धन्यवाद जय यह एक _very_ अच्छा लेखन है जिसने मुझे आज बहुत समय बचाया! –

+0

बहुत बढ़िया स्पष्टीकरण! –

+0

मार्ग के रेल 3 संस्करण क्या होंगे? – sguha

2

API Docs से:

map.connect 'articles/:year/:month/:day', 
      :controller => 'articles', 
      :action  => 'find_by_date', 
      :year  => /\d{4}/, 
      :month  => /\d{1,2}/, 
      :day  => /\d{1,2}/ 

मार्ग से ऊपर का उपयोग करना, यूआरएल "स्थानीय होस्ट: 3000/लेख/2005/11/06" नक्शे

params = { :year => '2005', :month => '11', :day => '06' } 

को ऐसा लगता है कि आप क्या करना चाहते एक ही बात है, लेकिन एक पोस्ट स्लॉग प्रत्यय। आपके नए और संपादन लिंक अभी भी "पुराने स्कूल" लिंक होंगे, जैसे "लोकलहोस्ट: 3000/लेख/1/संपादित करें" और "लोकलहोस्ट: 3000/लेख/नया"। बस "शो" लिंक को इसके साथ अपडेट किया जाना चाहिए।

config/routes.rb:

+0

हे जेरेट, पोस्ट के लिए धन्यवाद। स्लग कोई समस्या नहीं है, to_param इसका ख्याल रख सकता है। मैं वास्तव में क्या करना चाहता हूं 'map.connect' से छुटकारा पाएं और इसे 'map.resources' पर कॉल में संभाल लें, इसलिए मुझे अपने सभी मौजूदा कॉल को blog_path (@blog) आदि में संशोधित करने की आवश्यकता नहीं है। आदर्श रूप से मैं url_for (@blog) को कॉल करना चाहता हूं और '/ blogs/2010/01/08/1-to_param-or-something' जैसे कुछ वापस प्राप्त करना चाहता हूं, जिसे मैं कल्पना करता हूं। Map.connect के साथ संभव नहीं है। मैं अनुमान लगा रहा हूं कि मैं जो चाहता हूं वह संभव नहीं है (क्या यह यूआरएल प्रारूप वैसे भी सही है?), मैं बस यह देखने की कोशिश कर रहा हूं कि किसी के पास कोई रचनात्मक समाधान है या नहीं। – carpeliam

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