2008-10-23 12 views
29

मैंने हाल ही में एक रेल परियोजना शुरू की और RESTful नियंत्रकों का उपयोग करने का फैसला किया। मैंने अपनी प्रमुख इकाइयों (जैसे देश) के लिए नियंत्रक बनाए और index, new, edit, create, show, update और delete जोड़ा। मैंने अपनी map.resources :country को अपनी मार्ग फ़ाइल में जोड़ा और जीवन अच्छा था।मेरे रेल एप्लिकेशन को एक यथार्थ वास्तुकला में फिट करने के लिए मुझे कड़ी मेहनत करने की आवश्यकता क्यों है?

विकास के बाद थोड़ा सा प्रगति हुई, मुझे समस्याओं का सामना करना पड़ा। मुझे कभी-कभी अपने नियंत्रक में अतिरिक्त कार्रवाइयों की आवश्यकता होती है। सबसे पहले search एक्शन था जो मेरे फैंसी ऑटोकंपलेटिंग सर्च बॉक्स के लिए विकल्पों को वापस कर देता था। फिर आवेदन में विभिन्न स्थानों में देशों को दो अलग-अलग तरीकों से प्रदर्शित करने की आवश्यकता आई थी (प्रदर्शित डेटा भी अलग था, इसलिए यह केवल दो विचार नहीं था) - मैंने index_full कार्रवाई को जोड़ा। फिर मैं यूआरएल में नाम से देश दिखाना चाहता था, आईडी द्वारा नहीं, इसलिए मैंने show_by_name एक्शन जोड़ा।

जब आप परे कार्रवाई की जरूरत है क्या करते हो मानक index, new, edit, create, show, update, रेल में एक आरामदायक नियंत्रक में delete? क्या मुझे रूट.आरबी फ़ाइल (जो दर्द है) में मैन्युअल मार्ग जोड़ने (और बनाए रखने) की आवश्यकता है, क्या वे एक अलग नियंत्रक में जाते हैं, क्या मैं अनावश्यक हो जाता हूं या क्या मुझे कुछ मौलिक याद आ रही है?

मुझे लगता है कि मैं पूछ रहा हूं, क्या मुझे कड़ी मेहनत करने और मेरे मार्गों में कार्रवाई जोड़ने की आवश्यकता है। आरबी फ़ाइल रीस्टफुल होने के विशेषाधिकार के लिए? अगर मैं आरईएसटी उपहार जोड़ने के लिए map.resources का उपयोग नहीं कर रहा था, तो मानक :controller/:action, :controller/:action/:id मार्ग स्वचालित रूप से बहुत अधिक सब कुछ संभाल लेंगे।

+2

रेल डिफ़ॉल्ट विधियों के कारण आरईएसटी के अर्थ के बारे में बहुत भ्रम लगता है। आरईएसटी उन तरीकों तक ही सीमित नहीं है, और वास्तव में उन विशेष तरीकों के बारे में नहीं है। मुझे यह भी समझ में नहीं आता कि आपको लगता है कि नियंत्रक को अतिरिक्त तरीकों को जोड़ने के दौरान आपको कड़ी मेहनत क्यों करनी है। – jshen

उत्तर

8

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

map.resources :events, :collection => { :search => :get } 

एक पूरी तरह से अलग नियंत्रक से इन कार्यों ले जाने से आपकी नियंत्रकों के कुछ RESTful रखने सकता है, लेकिन मुझे लगता है कि उन्हें संदर्भ में रखते हुए कहीं अधिक उपयोगी है।

+0

मुझे अपने मार्ग फ़ाइल में मैन्युअल रूप से बहुत से क्रिया नाम जोड़ने और बनाए रखने से नफरत है। अगर मैं आरईएसटी का उपयोग नहीं कर रहा था तो मुझे इसे करने की आवश्यकता नहीं होगी। क्या कोई क्लीनर तरीका है? यदि नहीं तो यह है। – RichH

+1

अन्यथा मार्ग संपादन को संभालने की आवश्यकता नहीं होगी? बस ": नियंत्रक => XXX,: action => YYY" वाक्यविन्यास का उपयोग करके? नामित मार्ग एक अच्छा अभ्यास है, चाहे आप आरईएसटी का उपयोग कर रहे हों या नहीं। – Micah

+3

खोज, index_full, show_by_name सभी पैरामीटरकृत क्रियाएं पुनर्प्राप्त कर रहे हैं (यानी सीआरयूडी में आर)। नए मार्ग जोड़ने की जरूरत नहीं है। –

5

REST निर्दिष्ट नहीं करता है कि आपके पास अतिरिक्त विचार नहीं हो सकते हैं। कोई असली दुनिया का आवेदन केवल आपूर्ति किए गए कार्यों का उपयोग करने में सक्षम नहीं होगा; यही कारण है कि आप अपने स्वयं के कार्यों को जोड़ सकते हैं।

REST सर्वर पर स्टेटलेस कॉल करने में सक्षम होने के बारे में है। आपकी खोज क्रिया हर बार स्टेटलेस है क्योंकि डेटा अब तक आपूर्ति की जाती है, सही? आपकी वैकल्पिक प्रदर्शन कार्रवाई भी स्टेटलेस है, बस एक अलग दृश्य है।

यदि वे मैन्युअल मार्ग या एक नया नियंत्रक होना चाहिए, तो यह इस बात पर निर्भर करता है कि गतिविधि कितनी अलग है। आपका वैकल्पिक दृश्य, यदि यह CRUD का एक पूरा सेट प्रदान करता है (बनाएं, पढ़ें, अपडेट करें, हटाएं) संचालन एक नए नियंत्रक में होना अच्छा होगा। यदि आपके पास डेटा के लिए केवल देखें, तो मैं केवल एक वैकल्पिक दृश्य क्रिया जोड़ूंगा।

दूसरे शब्दों में, ऐसा लगता है कि आपका एप्लिकेशन रीस्टफुल होने में असफल रहा है, यह महसूस करने का एक मुद्दा है कि स्वचालित रूप से जेनरेट की गई सुविधा सेट एक प्रारंभिक बिंदु है, निष्कर्ष नहीं।

+0

मैं राज्यिक हूं, इसलिए मैं आरईएसटी का सही उपयोग कर रहा हूं। मुझे लगता है कि मेरी चिंता यह है कि क्योंकि मैंने रीस्टफुल होने का फैसला किया है अब मुझे अपने मार्गों में बहुत अधिक काम करने की ज़रूरत है। आरबी फाइल जो मुझे करने की ज़रूरत नहीं है अगर मैंने आरईएसटी का उपयोग नहीं किया। – RichH

+0

ठीक है, कोड को कहीं जाना है: यदि आप महसूस कर रहे हैं कि स्पष्ट रूप से परिभाषित क्रियाएं अतिरिक्त फ़्लैग डेटा रखने से कम उपयोगी हैं जो कहती हैं कि किस दृश्य का उपयोग करना है? जबकि ध्वज कोड के लिए आसान है, यह अस्पष्ट करता है कि कार्रवाई काफी कुछ कर रही है। कार्यों की खोज योग्य प्रकृति अच्छी है। – Godeke

+0

मैं ध्वज विचार के खिलाफ 100% हूं - वहां कोई चिंता नहीं है। समस्या यह है कि एक बार जब मैं REST मैपिंग जोड़ने के लिए नियंत्रक के लिए map.resources लाइन जोड़ता हूं, तो मेरे क्रियाएं रूट फ़ाइल में मैन्युअल रूप से कॉन्फ़िगर करने की आवश्यकता के लिए स्वचालित रूप से खोजने योग्य होने से होती हैं। मैं फिर स्ट्रैट्स flashbacks शुरू करना शुरू !! – RichH

13

मैं का index के विशेष मामले के रूप में व्यवहार करता हूं। दोनों कार्य संसाधनों का संग्रह वापस करते हैं। अनुरोध पैरामीटर को पेज, सीमा, सॉर्ट ऑर्डर और खोज क्वेरी जैसी चीजें निर्दिष्ट करनी चाहिए।

उदाहरण के लिए:

/resources/index # normal index 
/resources/index?query=foo # search for 'foo' 

और resources_controller में:

before_filter :do_some_preprocessing_on_parameters 

def index 
    @resources = Resource.find_by_param(@preprocessed_params) 
end 

index_full और search_by_name का सवाल है, तो आप दो में अपने वर्तमान नियंत्रक बंटवारे पर लग सकता है। आपने जो वर्णन किया है उसके बारे में एक गंध है।

यह कहकर, आप बिल्कुल सही हैं कि आपके ऐप को उपयोगकर्ता को सुरक्षित मार्गों पर मजबूर करने में कोई बात नहीं है जब यह /:controller/:action/:id पर कुछ भी वितरित नहीं करता है। निर्णय लेने के लिए, देखें कि आप कितनी बार फॉर्म और लिंक में शेष संसाधन मार्ग सहायकों का उपयोग कर रहे हैं। यदि आप उनका उपयोग नहीं कर रहे हैं, तो मैं इससे परेशान नहीं होगा।

+0

शुरुआत में आपके द्वारा वर्णित दृष्टिकोण मेरे दिमाग में एमवीसी पैटर्न को तोड़ देता है। मैं ऐसी कार्रवाई करने से जाता हूं जो एक चीज को एक ऐसी चीज से साफ करता है जो छिपे तरीके से कई अलग-अलग चीजें करता है। आपका आखिरी बिंदु दिलचस्प है - शायद मुझे आराम से मार्गों का उपयोग नहीं करना चाहिए? – RichH

+0

मैं इसे इस तरह से देखता हूं: एक खोज संसाधनों का एक गुच्छा पाती है और उन्हें किसी प्रकार के क्रम में प्रदर्शित करती है। इंडेक्स एक्शन वही करता है, लेकिन - डिफ़ॉल्ट रूप से - एक हार्डकोडेड तरीके से। तो वास्तव में, सूचकांक खोज का एक विशेष मामला है :) –

+0

मैं एम्बिजेंस के साथ सहमत हूंइंड: मैं इंडेक्स को खोज के एक विशेष मामले के रूप में देखता हूं। – MiniQuark

-1

अपने डिज़ाइन में रीस्टफुल रहने के लिए, आपको उस संसाधन पर पुनर्विचार करना होगा जिसे आप संसाधन कहते हैं।

आपके उदाहरण में एक खोज नियंत्रक के लिए एक शो क्रिया, (खोज संसाधन) आराम से रहने की दिशा है।

मेरा में, मैं एक डैशबोर्ड नियंत्रक (शो) और यथा-स्थान ecditors (शो और अद्यतन)

+0

मुझे यकीन नहीं है कि मैं समझता हूं कि आपका क्या मतलब है। क्या आप अधिक विस्तार से बताएंगे? क्या आप कह रहे हैं कि कुछ क्रियाएं (जैसे खोज) संसाधनों के रूप में देखी जानी चाहिए? कुछ "map.resources: user_search" जैसा है? – MiniQuark

0

मेरी राय वे यहाँ रेल बंद एक सा हो गया है हो सकता है में से एक क्षेत्र के लिए नियंत्रकों की है। डीआरवाई के साथ क्या हुआ?

मैं अभी बीटा के बाद से इसके साथ बहुत अधिक विकास नहीं कर रहा रेल में वापस आ रहा हूं और मैं अभी भी प्रकाश-बल्ब के आने का इंतजार कर रहा हूं। मैं अभी भी इसे एक मौका दे रहा हूं लेकिन अगर यह मेरे वर्तमान प्रोजेक्ट के अंत तक मेरे लिए नहीं हुआ है तो शायद मैं पुराने मानक मार्गों पर बस वापस आऊंगा और विधियों को परिभाषित करूँगा क्योंकि मुझे वास्तव में उन्हें अगले के लिए चाहिए ।

+0

संसाधन मार्गों को DRYness पर बहुत कम प्रभाव पड़ता है, यह कॉन्फ़िगरेशन पर सम्मेलन के बारे में अधिक है। उन्होंने सभी सीआरयूडी कार्यों के लिए मानक नामित मार्ग स्थापित किए, जिन पर मैंने काम किया है 20 या तो रेल ऐप्स के लिए हमेशा 90% मार्गों से ऊपर रहे हैं। बेशक डिफ़ॉल्ट का उपयोग कर: नियंत्रक /: एक्शन /: आईडी terse लगता है, लेकिन जब आपके पास हजारों हजारों url_for हैं: नियंत्रक => 'foo',: action => 'bar',: id => @ foo_url (@foo) की बजाय foored अपने टेम्पलेट्स में भरे हुए? – gtd

0

मैं आरईएसटी के बारे में अधिक जानकारी देने के लिए आगे नहीं बढ़ूंगा क्योंकि मुझे लगता है कि इस प्रश्न में उत्तर दिया गया है, हालांकि मैं डिफ़ॉल्ट मार्ग के बारे में थोड़ा सा बात करूंगा।

डिफ़ॉल्ट मार्ग के साथ मेरी मुख्य समस्या यह है कि यदि आपके पास एक ही रेल ऐप का उपयोग करके कई साइटें हैं तो यह भयानक लग सकती है।

http://example1.somesite.com/example_2/foo/bar/1 

/:controller/:action/:id 

को यह तुलना इस नियंत्रक example_2 करने के लिए जाना होगा:

उदाहरण के लिए वहाँ नियंत्रकों है कि आप लोगों के लिए एक अनुप्रयोग पर देखने में सक्षम हो नहीं करना चाहते हो सकता है/foo, एक्शन बार और आईडी 1

मैं इसे रेल के डिफ़ॉल्ट मार्ग का मुख्य दोष मानता हूं और यह ऐसा कुछ है जो विश्वसनीय मार्ग (सबडोमेन एक्सटेंशन के साथ) या केवल नामित मार्ग (map.connect 'foo' ...) ठीक कर सकते हैं।

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

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