2011-12-31 10 views
28

रेल में, मैं control_name को कॉल करके वर्तमान नियंत्रक का नाम नियंत्रक_नाम और वर्तमान क्रिया का नाम प्राप्त कर सकता हूं। मैं निम्नलिखित लाने के लिए समान रनटाइम प्रतिबिंब की तलाश में हूं:रेल पर रूबी में नियंत्रकों और कार्यों की सूची कैसे प्राप्त करें?

  1. एप्लिकेशन में सभी नियंत्रकों की सूची।
  2. किसी दिए गए नियंत्रक में सभी कार्यों की सूची।

उदाहरण के लिए, मैं एक उत्पाद नियंत्रक जिसमें "जोड़" और "संपादन" क्रियाएं हैं। क्या मैं उपयोगकर्ता को यह दिखाने के लिए प्रोग्रामिंग रूप से इन कार्यों के नाम खींच सकता हूं कि कौन से संचालन समर्थित हैं?

मैंने एक विधि को देखा है जो ActionController::Routing::Routes.named_routes.routes.each के उपयोग के लिए कॉल करता है लेकिन मैं इसे काम नहीं कर सका। जब मैंने इसका इस्तेमाल किया तो मुझे निरंतर स्थिर ActionDispatch::Routing::Routes त्रुटि मिली।

यदि कोई अच्छा ट्यूटोरियल या दस्तावेज़ है जो मुझे समझने में मदद कर सकता है कि रेल प्रतिबिंब क्षमताओं कैसे हैं। मैंने इसकी खोज की लेकिन मुझे ज्यादातर सक्रिय रिकॉर्ड प्रतिबिंब संबंधित ब्लॉग मिल गए। मैं ऐसा कुछ ढूंढ रहा हूं जो मुझे रन टाइम पर नियंत्रकों और कार्यों/विधियों पर जानकारी प्राप्त करने देता है।
धन्यवाद,

तबरेज

+0

क्या आप इसे रन-टाइम या रेक जॉब में कर रहे हैं। रन-टाइम एक बुरा विचार है। रेक काम करना आसान है। – drhenner

+0

क्या आपका मतलब "रेक मार्ग" था? मैं रन टाइम पर कुछ ढूंढ रहा था। मुझे व्यापक जानकारी की आवश्यकता नहीं है जो राउट मार्गों को आउटपुट करता है। मुझे केवल नियंत्रक नामों की आवश्यकता है, जो मुझे लगता है कि संग्रह के रूप में उपलब्ध होना चाहिए। रेल के लिए नोब होने के नाते, मुझे नहीं पता कि रनटाइम पर रेल में संदर्भ वस्तुएं क्या पहुंच योग्य हैं। – Tabrez

+0

यहां एक ही प्रश्न मिला, http://stackoverflow.com/questions/1564278/how-to-programmatically-list-all-controllers-in-rails – nkm

उत्तर

92

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

ApplicationController.descendants 

लेकिन, जैसा कि कक्षाओं lazily लोड किए गए हैं, अगर आपने अपने सभी वर्गों के लिए उत्सुक लोड करने की आवश्यकता होगी तुम इसे करो। ध्यान रखें कि इस विधि में समय लगेगा, और यह नीचे अपने बूट धीमी हो जाएगी:

Rails.application.eager_load! 

एक नियंत्रक में सभी कार्यों पाने के लिए, action_methods

PostsController.action_methods 

का उपयोग यह एक Set एक युक्त वापस आ जाएगी आपके कंट्रोलर में सभी विधियों की सूची जो "क्रियाएं" हैं (उसी लॉजिक रेल का उपयोग करके यह तय करने के लिए उपयोग किया जाता है कि कोई विधि रूट करने के लिए एक वैध क्रिया है या नहीं)।

+0

यह वही था जो मैं खोज रहा था। आपका बहुत बहुत धन्यवाद! क्या कोई विशेष रेल संसाधन/गाइड/पुस्तक है जो इस तरह के मामलों को समझने में मदद कर सकती है; अधिक विशेष रूप से पेज लाइफसाइक्ल और रनटाइम ऑब्जेक्ट्स जो रेल के माध्यम से गुजरती हैं? किसी भी पॉइंटर्स एक बड़ी मदद होगी क्योंकि मैं रेल के लिए नया हूं। – Tabrez

+1

यह उल्लेख करने लायक है कि 'कॉल करके।action_methods' आपको केवल कक्षा में परिभाषित सार्वजनिक विधियों (= क्रियाओं) की सूची मिलती है। चूंकि रेल नियंत्रक में वास्तविक विधि के बिना टेम्पलेट प्रस्तुत कर सकते हैं, इसलिए यह संभवतः एप्लिकेशन में सुरक्षा छेद का कारण बन सकता है। –

1

PostsController.action_methodsPostsController के सभी कार्यों मैं PostsController.instance_methods(false) पाया है, जो PostsController के सभी उदाहरण तरीकों वापस आ जाएगी और न विरासत में मिला शामिल है, मैं वास्तव में क्या चाहते हैं वापस आ जाएगी विरासत में मिला सहित, यह मैं क्या चाहते हैं नहीं है,।

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