2011-10-07 15 views
5

पढ़ने के लिए एक पकड़-मार्ग को आसान बनाने और संशोधित करने के लिए मैं रेल 3 में कैच-ऑल रूट लिखने की कोशिश कर रहा हूं, लेकिन मैं इसमें कुछ शर्तों को आरक्षित करना चाहता हूं। मैं विशेष रूप से उदाहरण का अनुसरण कर रहा हूँ आगे डेविड बरोज़ द्वारा जवाब में, इस पोस्ट में डाल दिया: Dynamic routes with Rails 3रेल 3:

वाक्य रचना मैं उपयोग कर रहा हूँ निम्नलिखित है:

match '*path' => 'router#routing', :constraints => lambda{|req| (req.env["REQUEST_PATH"] =~ /(users|my-stuff)/).nil? } 

कि वाक्य रचना बस ठीक काम करता है अब, - अगर कोई उपयोगकर्ता पथ में "उपयोगकर्ता" या "मेरी-सामग्री" वाले किसी पृष्ठ पर जाता है, यह कैच-सब के माध्यम से आता है और एक विशिष्ट स्थान पर जाता है। यदि उपयोगकर्ता किसी अन्य यूआरएल पर जाता है, तो यह मेरे रूटिंग तर्क पर जाता है।

मेरा प्रश्न पठनीयता के बारे में अधिक है - क्या कोई तरीका है कि मैं किसी रेगेक्स की तुलना में अन्य के खिलाफ मार्ग से मिलान कर सकता हूं? क्या मैच के लिए शर्तों की एक सरणी प्रदान करने का कोई तरीका है? साथ ही, क्या पूरी चीज के विपरीत मार्ग के विशिष्ट खंडों से मेल खाने का कोई तरीका है?

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

किसी भी मदद

यहाँ के लिए धन्यवाद नीचे प्रति जवाब अद्यतन मार्गों फ़ाइल है:

class RouteConstraint 
    RESERVED_ROUTES = ['users', 'my-stuff'] 

    def matches?(request) 
    !RESERVED_ROUTES.map {|r| request.path.include?(r)}.empty? 
    end 
end 

App::Application.routes.draw do 
    resources :categories 
    resources :sites 

    match '*path' => 'router#routing', :constraints => RouteConstraint.new 

    devise_for :users, :path_names =>{ :sign_in => 'login', :sign_out => 'logout', :registration => 'register' } 
    root :to => "router#routing" 
end 

उत्तर

6

आप बाधाओं निर्दिष्ट करने के लिए एक वर्ग का उपयोग करता है, तो आप कुछ क्लीनर चाहते एक बार आप का प्रयास करने के कई मार्गों हो सकता है:

class MyConstraint 
    BYPASSED_ROUTES = ['users', 'my-stuff'] 

    def matches?(request) 
    BYPASSED_ROUTES.map {|r| request.path.include?(r)} .empty? 
    end 
end 

TwitterClone::Application.routes.draw do 
    match "*path" => "router#routing", :constraints => MyConstraint.new 
end 

यह उदाहरण rails routing guide से अनुकूलित है।

+0

यह बंद हो जाता है, लेकिन अब सूचीबद्ध "छिपा मार्ग" को छोड़ने के बजाय, तर्क उन्हें रूटिंग नियंत्रक को खिलाने का प्रयास करता है। अगर मैं बैंग या .empty हटा देता हूँ? मैचों की विधि में कॉल करें, तर्क आरक्षित शब्दों के लिए काम करता है, लेकिन बाकी सब कुछ के लिए नहीं। क्षमा करें, भेड़ का बच्चा मेरी समझ बहुत सीमित है। –

+0

आह, मैंने आपके प्रश्न को गलत समझा, तो मेरा तर्क आपके बिल्कुल विपरीत था। क्या आप अपनी रूट फाइलों में से कुछ और पोस्ट कर सकते हैं, यह देखने के लिए कि कैच-सब कैसे फिट बैठता है? –

+0

ठीक है, मैंने ऊपर दिए गए मेरे प्रश्न के वर्तमान मार्ग जोड़े हैं। –

0

यह एक लैम्ब्डा ले रहा है; आप जो भी मानदंड चाहते हैं उसका उपयोग कर सकते हैं।