2011-02-03 25 views
14
के आधार पर मार्गों

मैं इस पर इसी तरह के सवाल देखा है, लेकिन काफी क्या मैं एक पल ऐसा करने का ज्ञान के लिए भूलकर के लिए ... देख रहा हूँ नहीं है, यह संभव है ऐसा करें? ...की स्थापना रेल QueryString

/object/update/123?o=section # ==> route to SectionController#update 
/object/update/456?o=question # ==> route to QuestionController#update 

... और यदि हां, तो यह कैसे किया जाएगा?

+0

मैं केवल इस मामले में नियंत्रक में redirect_ti विकल्पों को देखने के – apneadiving

उत्तर

3

ऐसा करने के लिए, चाहे वह बुद्धिमान है का सवाल एक तरफ स्थापना, जवाब देने के लिए "यह संभव है" 'हां' है:

class QueryControllerApp 
    def self.call(env) 
    controller_name = env['QUERY_STRING'].split('=').last 
    controller = (controller_name.titleize.pluralize + "Controller").constantize 
    controller.action(:update).call(env) 
    rescue NameError 
    raise "#{controller_name} is an invalid parameter" 
    end 
end 

MyRailsApp::Application.routes.draw do 
    put 'posts/update/:id' => QueryControllerApp 
end 

मूल रूप से मार्ग नक्शाकार कि समाप्ति बिंदु के रूप में किसी भी रैक आवेदन को स्वीकार कर सकते हैं। हमारा सरल ऐप क्वेरी स्ट्रिंग को पार करता है, नियंत्रक का नाम बनाता है और एक्शनकंट्रोलर विधि action (जो स्वयं एक रैक एप्लिकेशन है) को कॉल करता है। दिखाया नहीं गया है: 'o=<controller_name>'

+0

के रूप में सबसे अच्छा मैं कर सकते हैं यह बताएं कि आपकी क्वेरी स्ट्रिंग को बंद करने के दुष्प्रभाव के बिना "रीडायरेक्ट" करने का यही एकमात्र तरीका है। धन्यवाद @zetetic – SooDesuNe

+2

क्वेरी स्टिंग पर प्राप्त करने के लिए '.plit' के बजाय, मैं उपयोग करूंगा: 'रैक :: Utils.parse_nested_query (env [" QUERY_STRING "])' – SooDesuNe

16

मान लें कि आप रेल 3+ का उपयोग कर रहे हैं, तो आप "उन्नत प्रतिबंध" का उपयोग कर सकते हैं (http://guides.rubyonrails.org/routing.html#advanced-constraints पर उनके बारे में और पढ़ें)। routes.rb के लिए ही

module SectionConstraint 
    extend self 

    def matches?(request) 
    request.query_parameters["o"] == "section" 
    end 
end 

module QuestionConstraint 
    extend self 

    def matches?(request) 
    request.query_parameters["o"] == "question" 
    end 
end 

Rails.application.routes.draw do 
    match "/object/update/:id" => "section#update", :constraints => SectionConstraint 
    match "/object/update/:id" => "question#update", :constraints => QuestionConstraint 
end 
+0

कहां, इस मॉड्यूल को किस फ़ोल्डर में लिखा जाना चाहिए? मैं आरओआर के लिए नौसिखिया हूँ। – inquisitive

11

अधिक संक्षिप्त से @moonmaster9000 के जवाब:

यहाँ अपने उदाहरण का समाधान करने का तरीका बताया

match "/object/update/:id" => "section#update", 
    :constraints => lambda { |request| request.params[:o] == "section" } 
match "/object/update/:id" => "question#update", 
    :constraints => lambda { |request| request.params[:o] == "question" } 
संबंधित मुद्दे