2012-03-08 12 views
6

मैं सिनात्रा एप्लिकेशन में सबक्लासिंग शैली का उपयोग करने की कोशिश कर रहा हूं। तो, मेरे पास इस तरह का एक मुख्य ऐप है।मॉड्यूलर सिनात्रा एप्लिकेशन में मैं config.ru को ठीक से कैसे करूं?

class MyApp < Sinatra::Base 
    get '/' 
    end 

    ... 
end 

class AnotherRoute < MyApp 
    get '/another' 
    end 

    post '/another' 
    end 
end 
run Rack::URLMap.new \ 
    "/"  => MyApp.new, 
    "/another" => AnotherRoute.new 

config.ru में मैं समझता हूँ कि यह केवल "GET" कैसे के बारे में अन्य संसाधनों के लिए है (उदाहरण के लिए "PUT", "पोस्ट")? मुझे यकीन नहीं है कि मैं कुछ स्पष्ट याद कर रहा हूं। और अगर मेरे पास दस पथ (/ path1,/path2, ...) हैं तो क्या मुझे उन्हें config.ru में कॉन्फ़िगर करना होगा, भले ही वे एक ही कक्षा में हों?

+0

आप पथ प्रति अलग वर्ग के लिए क्यों चाहते हो? MyApp में आपके पास सभी यूआरएल मानचित्रण क्यों नहीं हो सकते? – ch4nd4n

+0

मैं बस इसे अलग करना आसान बनाना चाहता हूं क्योंकि मेरा ऐप बड़ा हो रहा है और मैं हर समय ऊपर और नीचे स्क्रॉल नहीं करना चाहता हूं। – toy

+0

क्या आपने [पैड्रिनो] (http://www.padrinorb.com/) पर एक नज़र डाली? यह सिनात्रा के शीर्ष पर एक ** लचीला ** रैपर है। – ch4nd4n

उत्तर

4

पर दस्तावेज़ीकरण देखेंआप एक बेस यूआरएल निर्दिष्ट करते हैं जहां ऐप को आरोहित किया जाना चाहिए। मानचित्र में निर्दिष्ट पथ का उपयोग तब नहीं किया जाता है जब यह निर्धारित किया जाता है कि ऐप के भीतर कौन सा मार्ग उपयोग करना है। दूसरे शब्दों में ऐप कार्य करता है जैसे कि यह URLMap में उपयोग किया जाने वाला पथ है।

उदाहरण के लिए, अपने कोड निम्न पथों का जवाब देंगे:

  • /: MyApp

  • /another में / मार्ग पर ले जाया जाएगा: AnotherRoute में / मार्ग के लिए जाना जाएगा। चूंकि AnotherRouteMyApp बढ़ाता है यह MyApp में / जैसा होगा (लेकिन एक अलग उदाहरण में)।

    URLMap/another देखता है और AnotherRoute पर नक्शा देखने के लिए इसका उपयोग करता है, पथ से अनुरोध के इस भाग को अलग करता है। AnotherRoute तो केवल / देखता है।

  • /another/another: AnotherRoute में दो /another मार्गों पर जाया जाएगा। फिर, AnotherRoute पर अनुरोध को रूट करने के लिए URL0 द्वारा पहले another का उपयोग किया जाता है। AnotherRoute तो पथ के रूप में केवल दूसरे another को देखता है।

    ध्यान दें कि यह पथ GET और POST अनुरोधों का उत्तर देगा, प्रत्येक को उचित ब्लॉक द्वारा संभाला जा रहा है।

यह स्पष्ट नहीं है तुम क्या करने की कोशिश कर रहे हैं, लेकिन मुझे लगता है आप प्राप्त कर सकते AnotherRoute का एक उदाहरण चलाकर आप क्या चाहते हैं, एक config.ru साथ वह यह है कि बस:

run AnotherRoute.new 

AnotherRoute के बाद से MyApp बढ़ाता है, / मार्ग इसके लिए परिभाषित किया जाएगा।

यदि आप किसी मौजूदा सिनात्रा एप्लिकेशन में मार्ग जोड़ने का कोई तरीका ढूंढ रहे हैं, तो आप विरासत का उपयोग करने के बजाय create a module with an included method that adds the routes कर सकते हैं।

15

app.rb

class MyApp < Sinatra::Base 
    get '/' 
    end 
end 

app2.rb आप दो अलग फ़ाइलों चाहते हैं। ध्यान दें कि यह Sinatra :: आधार नहीं MyApp से विरासत में मिलता है।

class AnotherRoute < Sinatra::Base 
    get '/' 
    end 

    post '/' 
    end 
end 

config.ru

require 'bundler/setup' 
Bundler.require(:default) 

require File.dirname(__FILE__) + "/lib/app.rb" 
require File.dirname(__FILE__) + "/lib/app2.rb" 


map "/" do 
    run MyApp 
end 

map "/another" do 
    run AnotherRoute 
end