2012-08-22 26 views
6

मैं पुशस्टेट विकल्प के साथ रेल 3.2 और बैकबोन.जेएस के साथ एक सिंगल पेज ऐप बनाने का प्रयास करता हूं लेकिन मुझे कुछ समझने का सामना करना पड़ता है।एक एकल ऐप ऐप में गैर-रूट यूआरएल कैसे संभालें?

यदि मैं ऐप (/) का रूट यूआरएल लोड करता हूं, तो सब ठीक हो जाता है: रेल जेएस के साथ एक एचटीएमएल-लेआउट लौटाता है जो बैकबोन बूटस्ट्रोन करता है जो JSON-entities के लिए कुछ एक्सएचआर बनाता है और सामग्री प्रस्तुत करता है।

लेकिन अगर मैं गैर-रूट यूआरएल से एप्लिकेशन का उपयोग शुरू तो रेल routes.rb से उनकी रूटिंग नियम का उपयोग कर इस अनुरोध को पूरा करने की कोशिश करेंगे (मैन्युअल रूप से ब्राउज़र के एड्रेस बार में यह लिखकर जैसे) - यह गलत है, कारण यह एक "बैकबोन" मार्ग है। इस मामले में इस यूआरएल को संभालने के लिए मैं पेज और बूटस्ट्रैप बैकबोन कैसे लोड करूं?

उत्तर

14

अंत में मैं समाधान मिल गया।

मैं इस मेल खाने वाले सभी गैर-एक्सएचआर अनुरोध HomeController ले जाया जाता है जो एक HTML पृष्ठ रिटर्न के साथ मेरी routes.rb

class XHRConstraint 
    def matches?(request) 
    !request.xhr? && !(request.url =~ /\.json$/ && ::Rails.env == 'development') 
    end 
end 

match '(*url)' => 'home#index', :constraints => XHRConstraint.new 

में निम्न कोड डाल दिया। और एक्सएचआर अनुरोधों को अन्य नियंत्रकों द्वारा संभाला जाएगा जो जेएसओएन प्रतिक्रियाएं लौटाते हैं। इसके अलावा मैंने डिबगिंग के लिए विकास पर्यावरण में मान्य ".json" के साथ समाप्त होने वाले अनुरोधों को छोड़ दिया।

+0

ग्रेट जॉब आदमी! यह 1000 बार ऊपर उठाया जाना चाहिए। – wuliwong

+0

मेरे लिए पूरी तरह से काम करता है! – jordancooperman

+0

मुझे यह भी मिला [कला द्वारा महान लेखन] (http://artsy.github.com/blog/2012/06/25/replacing-hashbang-routes-with-pushstate/) वैश्विक लिंक बनाने का तरीका बताते हुए पेज रीफ्रेश से बचने के लिए बैकबोन पुशस्टेट के साथ हैंडलर, जो मुझे लगता है कि इस जवाब के साथ बहुत अधिक है और कुछ लोगों की मदद कर सकता है। – jordancooperman

1

यह कुछ हद तक मुश्किल मुद्दा है, लेकिन मूल रूप से संक्षेप में, आपको उसी रूट (रूट) पृष्ठ के साथ रेल में सभी मान्य (HTML) अनुरोधों का जवाब देना होगा, वहां से रीढ़ की हड्डी ले जाएगी और सही मार्ग तक पहुंच जाएगी हैंडलर (आपके बेकबोन राउटर में)। rails and backbone working together

मूल रूप से मैं क्या हर पृष्ठ है कि मैं संभाल करने के लिए चाहते हैं, और खाली विचारों के लिए कार्यों बनाने के लिए है:

मैं और अधिक विस्तार यहाँ में इस मुद्दे पर चर्चा की है। मैं respond_with का उपयोग पेज लौटने के लिए (जो प्रत्येक मामले में एक ही है) और क्योंकि मैं संभाल कार्यों प्राप्त केवल एचटीएमएल अनुरोधों के लिए, मैं नियंत्रक के शीर्ष पर इस पंक्ति जोड़ें:

respond_to :html, :only => [ :show, :new ] 

JSON अनुरोध कर रहे हैं respond_with के साथ भी संभाला गया, लेकिन HTML अनुरोधों के विपरीत वास्तव में अनुरोधित संसाधन लौटाता है (और PUT,और DELETE के मामले में अनुरोधित कार्रवाई निष्पादित करता है)।

+0

थोड़ा और जानकारी के साथ मेरा उत्तर अपडेट किया गया। –

+0

यह चाल करेगा लेकिन यह बहुत ही सुरुचिपूर्ण तरीका नहीं है क्योंकि बैकबोन के सभी मार्ग रेल द्वारा जिम्मेदार होना चाहिए। इसलिए जब आप ग्राहक के मार्ग बदलते हैं तो आपको सर्वर रूट अपडेट करना होगा।रूट नियंत्रक को सभी एचटीएमएल अनुरोधों को प्रतिनिधि करने का कोई तरीका नहीं है? – fey

+1

मैं असहमत हूं: यदि आप रूट नियंत्रक को * सभी * अनुरोधों का प्रतिनिधि देते हैं तो आप कह रहे हैं कि सभी अनुरोध मान्य हैं, वास्तव में जब अधिकांश नहीं हैं। रेल * की जरूरत है * यह जानने के लिए कि कौन से मार्ग वैध हैं और जो गलत मार्गों के लिए स्थिति कोड ठीक से वापस करने के लिए नहीं हैं, आदि। यह नकल है लेकिन यह महत्वपूर्ण डुप्लिकेशंस है। एक बार जब आप pushState का उपयोग शुरू करते हैं तो यह अनिवार्य है। –

1

यदि आप इसे मैन्युअल रूप से करते हैं तो बैकबोन को आपके यूआरएल परिवर्तन की जानकारी नहीं दी जाएगी। यह परिवर्तन ब्राउज़र द्वारा पकड़ा जाएगा और यह सामान्य रूप से सर्वर को अनुरोध भेजकर अपना काम करेगा।

वही अगर आप एक सामान्य लिंक पर क्लिक करते हैं, तो यह बैकबोन को सूचित किए बिना href का पालन करेगा।

यदि आप चाहते हैं कि बैकबोन यूआरएल परिवर्तन का प्रभारी हो, तो आपको इसे उपलब्ध बैकबोन टूल के माध्यम से करना होगा और यह स्वयं राउटर है।

तो तुम रीढ़ जिस तरह से आप यह स्पष्ट रूप से क्या करना है में एक URL परिवर्तन, की तरह कुछ करना चाहते हैं:

app.router.navigate("my/route", {trigger: true});