2009-10-14 3 views
22

में सभी नियंत्रकों को प्रोग्रामेटिक रूप से सूचीबद्ध करने के लिए कैसे मैं वास्तव में कई प्रकार की कॉन्फ़िगर करने योग्य ऑब्जेक्ट्स प्रबंधित करने के लिए एक रीस्टफुल ऐप बनाने की कोशिश कर रहा हूं, इसलिए बड़ी मात्रा में "संसाधन" प्रकार हैं, और इसलिए बहुत सारे नियंत्रक हैं। मैं अभी भी पीओसी चरण में हूं, इसलिए यह अच्छा होगा अगर मैं पहले नेविगेशन पेज में सभी नियंत्रकों को दिखा सकता हूं, तो ऐसा करने के लिए कोई आसान तरीका (प्रोग्राम करने योग्य)?रेल

उत्तर

5

गूगल: 'रेल सूची नियंत्रकों'

सबसे पहले परिणाम।

http://snippets.dzone.com/posts/show/4792


उपवर्गों के बारे में सीखने के बाद, मुझे लगता है कि मेरी लिंक से कोड के रूप में बस किया जा सकता है ..

ApplicationController.subclasses.each do |c| 
    puts "Controller: #{c}" 
    puts "Actions: #{c.constantize.action_methods.collect{|a| a.to_s}.join(', ')}" 
end 
+1

हैं आप नियंत्रकों और कार्यों को सूचीबद्ध करने जा रहे हैं, क्यों न केवल रेक मार्गों का उपयोग करें? सुनिश्चित करें कि आउटपुट गन्दा है, लेकिन यह आपकी टर्मिनल विंडो का विस्तार करके तय किया गया है। – EmFi

+0

मैं बस त्वरित कोड डाल रहा था जो लिंक के समान होगा। थोड़ा सा अभ्यास करना मुझे याद है। – Jim

22
ApplicationController.subclasses 

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

+4

विकास मोड में अपनी सूची को पॉप्युलेट करने के लिए आपको "# {RAILS_ROOT}/ऐप/नियंत्रकों" में सभी फ़ाइलों की आवश्यकता हो सकती है। – EmFi

+0

यह ध्यान रखना महत्वपूर्ण है कि यह उत्पादन मोड में काम करता है लेकिन विकास मोड में नहीं, क्योंकि नियंत्रक आलसी लोड होते हैं। रेल कंसोल मोड में अपने ऐप को फायर करें और सबक्लास/वंशजों को देखें और आप कोई भी नहीं देखेंगे। नियंत्रकों में से किसी एक के नाम पर टाइप करें, और फिर नामित वर्ग उप-वर्ग के रूप में दिखाई देगा। ActiveAdmin इस पर एक अच्छा काम करता प्रतीत होता है ... आप गिटहब पर अपना कोड देखना चाहेंगे। – Raels

+0

यह एक पूर्ण समाधान नहीं है क्योंकि यह सभी नियंत्रकों को नहीं मिलता है, केवल एप्लिकेशंस कंट्रोलर के प्रत्यक्ष उप-वर्ग। यदि आपके पदानुक्रम में घोंसले के दो स्तर हैं तो आप उन सभी को नहीं खाएंगे। इसके बजाय ApplicationController.descendants का उपयोग करें। और लोड नियंत्रक पर सभी नियंत्रकों को प्राप्त करने के लिए आप Rails.application.eager_load का उपयोग कर सकते हैं! आपके विकास या परीक्षण पर्यावरण प्रारंभकर्ताओं में, लेकिन सावधान रहें कि यह सभी रेल अनुप्रयोगों को लोड करेगा, यह बूट को धीमा कर सकता है और इसका कोई दुष्प्रभाव हो सकता है। –

38

रेल में 3.1+:

Rails.application.routes 

यह आप सभी नियंत्रकों, कार्यों और उनके मार्गों अगर आप अपने routes.rb फ़ाइल में उनके रास्ते है दे देंगे।

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

routes= Rails.application.routes.routes.map do |route| 
    {alias: route.name, path: route.path, controller: route.defaults[:controller], action: route.defaults[:action]} 
end 

अद्यतन: रेल 3.2 के लिए, जर्नल इंजन पथ, बदला तो कोड हो जाता है:

routes= Rails.application.routes.routes.map do |route| 
    {alias: route.name, path: route.path.spec.to_s, controller: route.defaults[:controller], action: route.defaults[:action]} 
end 

अद्यतन: फिर भी रेल 4.2.7 के लिए काम कर रहे। (प्रति वास्तविक प्रश्न) नियंत्रकों की सूची निकालने के लिए, आप बस नियंत्रक निकालने और कर सकते हैं uniq

controllers = Rails.application.routes.routes.map do |route| 
    route.defaults[:controller] 
end.uniq 
+0

यहां मेरे स्रोत हैं: https://github.com/rails/rails/blob/master/railties/lib/rails/tasks/routes.rake https://github.com/rails/rails/blob/ मास्टर/रेलटी/lib/रेल/आवेदन/path_inspector.rb मुझे यह भी एहसास हुआ कि रेल विकास मोड सर्वर जानकारी के लिए एक अंतर्निहित मार्ग बनाता है, लेकिन उस मार्ग को खोजने के लिए पाठक के लिए एक अभ्यास छोड़ दिया गया है। – nurettin

9

जबकि @ JDL की विधि स्थितियों की एक संख्या में काम करेंगे यह विफल रहता है यदि आप नियंत्रक उपवर्गों (जैसे से ContactPageController inherits है PageController जो ApplicationController से प्राप्त होता है)।

::ApplicationController.descendants 

का उपयोग करके आप जहां भागों इंजन के रूप में निकाला जाता है एक जटिल अनुप्रयोग है, तो routes काम नहीं कर सकता, इन छिपा दिए जाएंगे:

इसलिए एक बेहतर तरीका उपयोग करने के लिए है।

+0

सबक्लास सक्रिय व्यवस्थापक के लिए काम नहीं करते थे लेकिन आपके काम! धन्यवाद – Fedcomp

6

मैं विशेष रूप से समाधान

ApplicationController.subclasses 

लेकिन मेरे मामले में, जहां मैं वास्तव में अंडरस्कोर प्रारूप में सभी नियंत्रक के नाम की जरूरत में @jdl पसंद आया (मैं उपनिर्देशिका जैसे नहीं है: /admin) मैं निम्नलिखित प्रयोग किया है:

Dir[Rails.root.join('app/controllers/*_controller.rb')].map { |path| path.match(/(\w+)_controller.rb/); $1 }.compact 
2
Dir[Rails.root.join('app/controllers/*_controller.rb')].map { |path| (path.match(/(\w+)_controller.rb/); $1).camelize+"Controller" } 

इस रूप में यह नियंत्रक फ़ाइल के भीतर प्रकट होता है हमें नियंत्रक का सही नाम देता है।

2

एक अन्य समाधान और विकास में (यदि आप रेल 5 में हैं) और नियंत्रक और कार्यों मैप करने की आवश्यकता: अगर जरूरत:

Rails.application.routes.set.anchored_routes.map(&:defaults) 

आप अस्वीकार कर सकते हैं [आंतरिक]:

.reject { |route| route[:internal] }