2012-05-14 15 views
6

यह अजीब लग रहा है, लेकिन मुझे सुनें ... मुझे अपने अन्य नियंत्रकों में से एक को POST अनुरोध के बराबर बनाने में सक्षम होना चाहिए। SimpleController मूल रूप से एक अधिक वर्बोज नियंत्रक का सरलीकृत संस्करण है। मैं इसे उचित तरीके से कैसे कर सकता हूं?रेल: आंतरिक नियंत्रक को आंतरिक रूप से कैसे पोस्ट करें?

class VerboseController < ApplicationController 
    def create 
    # lots of required params 
    end 
end 

class SimpleController < ApplicationController 
    def create 
    # prepare the params required for VerboseController.create 
    # now call the VerboseController.create with the new params 
    end 
end 

शायद मैं इसे अधिक सोच रहा हूं, लेकिन मुझे नहीं पता कि यह कैसे करना है।

+1

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

+5

यह सब महान है कि यह नहीं किया जाना चाहिए, लेकिन कभी-कभी इसे करने की आवश्यकता होती है। उदाहरण के लिए, प्रमाणीकरण के बाद POST डेटा को पुनर्स्थापित करने के लिए, आदि –

+0

@TheDoctorW प्रमाणीकरण के बाद POST डेटा को पुनर्स्थापित करना शायद * केवल * मामला है जहां ऐसा कुछ समझ में आता है, और यहां तक ​​कि, मैं एक अलग दृष्टिकोण की तलाश करता हूं। यह निश्चित रूप से उस संदर्भ में समझ में नहीं आता है जिसमें सवाल पूछा गया था। –

उत्तर

7

एक रेल ऐप में इंटर-कंट्रोलर संचार (या उस मामले के लिए एक ही मॉडल-एडाप्टर-व्यू पैटर्न के बाद कोई भी वेब ऐप) कुछ ऐसा है जो आपको सक्रिय रूप से टालना चाहिए। जब आप ऐसा करने के लिए लुत्फ उठाते हैं तो इस बात पर विचार करें कि आप अपने ऐप पर बनाए गए पैटर्न और ढांचे से लड़ रहे हैं और आप तर्क पर निर्भर हैं कि आपके आवेदन की गलत परत पर लागू किया गया है।

जैसा कि @ismaelga ने एक टिप्पणी में सुझाव दिया; दोनों नियंत्रकों को इस साझा व्यवहार को संभालने और अपने नियंत्रकों को "पतला" रखने के लिए कुछ सामान्य घटक का आह्वान करना चाहिए। रेल में अक्सर मॉडल ऑब्जेक्ट पर एक विधि होती है, खासतौर पर सृजन व्यवहार के प्रकार के लिए आप इस मामले में चिंतित हैं।

3

आपको यह नहीं करना चाहिए। क्या आप एक मॉडल बना रहे हैं? फिर मॉडल पर दो वर्ग विधियां बहुत बेहतर होंगी। यह कोड को बेहतर तरीके से अलग करता है। फिर आप न केवल नियंत्रकों में बल्कि भविष्य में पृष्ठभूमि नौकरियों (आदि) के तरीकों का उपयोग कर सकते हैं।

उदाहरण के लिए यदि आप एक व्यक्ति बना रहे हैं तो:

class VerboseController < ApplicationController 
    def create 
    Person.verbose_create(params) 
    end 
end 

class SimpleController < ApplicationController 
    def create 
    Person.simple_create(params) 
    end 
end 

तो व्यक्ति-मॉडल में आप इस तरह जा सकते हैं:

class Person 
    def self.verbose_create(options) 
    # ... do the creating stuff here 
    end 

    def self.simple_create(options) 
    # Prepare the options as you were trying to do in the controller... 
    prepared_options = options.merge(some: "option") 
    # ... and pass them to the verbose_create method 
    verbose_create(prepared_options) 
    end 
end 

मुझे आशा है कि यह एक छोटे से कर सकते हैं। :-)

+1

क्या होगा यदि आप किसी अन्य कार्यवाही पर पुनर्निर्देशित करना चाहते हैं:: create' ताकि आप एक और मॉडल बना सकें? – mbigras

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