में सभी नियंत्रकों को प्रोग्रामेटिक रूप से सूचीबद्ध करने के लिए कैसे मैं वास्तव में कई प्रकार की कॉन्फ़िगर करने योग्य ऑब्जेक्ट्स प्रबंधित करने के लिए एक रीस्टफुल ऐप बनाने की कोशिश कर रहा हूं, इसलिए बड़ी मात्रा में "संसाधन" प्रकार हैं, और इसलिए बहुत सारे नियंत्रक हैं। मैं अभी भी पीओसी चरण में हूं, इसलिए यह अच्छा होगा अगर मैं पहले नेविगेशन पेज में सभी नियंत्रकों को दिखा सकता हूं, तो ऐसा करने के लिए कोई आसान तरीका (प्रोग्राम करने योग्य)?रेल
रेल
उत्तर
गूगल: 'रेल सूची नियंत्रकों'
सबसे पहले परिणाम।
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
ApplicationController.subclasses
यह मिलेगा आप शुरू कर दिया है, लेकिन ध्यान रखें कि विकास मोड में आप ज्यादा नहीं देखेंगे, क्योंकि यह केवल आपको दिखाएगा कि वास्तव में क्या लोड किया गया है। उत्पादन मोड में इसे फायर करें, और आपको अपने सभी नियंत्रकों की एक सूची देखना चाहिए।
विकास मोड में अपनी सूची को पॉप्युलेट करने के लिए आपको "# {RAILS_ROOT}/ऐप/नियंत्रकों" में सभी फ़ाइलों की आवश्यकता हो सकती है। – EmFi
यह ध्यान रखना महत्वपूर्ण है कि यह उत्पादन मोड में काम करता है लेकिन विकास मोड में नहीं, क्योंकि नियंत्रक आलसी लोड होते हैं। रेल कंसोल मोड में अपने ऐप को फायर करें और सबक्लास/वंशजों को देखें और आप कोई भी नहीं देखेंगे। नियंत्रकों में से किसी एक के नाम पर टाइप करें, और फिर नामित वर्ग उप-वर्ग के रूप में दिखाई देगा। ActiveAdmin इस पर एक अच्छा काम करता प्रतीत होता है ... आप गिटहब पर अपना कोड देखना चाहेंगे। – Raels
यह एक पूर्ण समाधान नहीं है क्योंकि यह सभी नियंत्रकों को नहीं मिलता है, केवल एप्लिकेशंस कंट्रोलर के प्रत्यक्ष उप-वर्ग। यदि आपके पदानुक्रम में घोंसले के दो स्तर हैं तो आप उन सभी को नहीं खाएंगे। इसके बजाय ApplicationController.descendants का उपयोग करें। और लोड नियंत्रक पर सभी नियंत्रकों को प्राप्त करने के लिए आप Rails.application.eager_load का उपयोग कर सकते हैं! आपके विकास या परीक्षण पर्यावरण प्रारंभकर्ताओं में, लेकिन सावधान रहें कि यह सभी रेल अनुप्रयोगों को लोड करेगा, यह बूट को धीमा कर सकता है और इसका कोई दुष्प्रभाव हो सकता है। –
रेल में 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
यहां मेरे स्रोत हैं: https://github.com/rails/rails/blob/master/railties/lib/rails/tasks/routes.rake https://github.com/rails/rails/blob/ मास्टर/रेलटी/lib/रेल/आवेदन/path_inspector.rb मुझे यह भी एहसास हुआ कि रेल विकास मोड सर्वर जानकारी के लिए एक अंतर्निहित मार्ग बनाता है, लेकिन उस मार्ग को खोजने के लिए पाठक के लिए एक अभ्यास छोड़ दिया गया है। – nurettin
जबकि @ JDL की विधि स्थितियों की एक संख्या में काम करेंगे यह विफल रहता है यदि आप नियंत्रक उपवर्गों (जैसे से ContactPageController
inherits है PageController
जो ApplicationController
से प्राप्त होता है)।
::ApplicationController.descendants
का उपयोग करके आप जहां भागों इंजन के रूप में निकाला जाता है एक जटिल अनुप्रयोग है, तो routes
काम नहीं कर सकता, इन छिपा दिए जाएंगे:
इसलिए एक बेहतर तरीका उपयोग करने के लिए है।
सबक्लास सक्रिय व्यवस्थापक के लिए काम नहीं करते थे लेकिन आपके काम! धन्यवाद – Fedcomp
मैं विशेष रूप से समाधान
ApplicationController.subclasses
लेकिन मेरे मामले में, जहां मैं वास्तव में अंडरस्कोर प्रारूप में सभी नियंत्रक के नाम की जरूरत में @jdl पसंद आया (मैं उपनिर्देशिका जैसे नहीं है: /admin
) मैं निम्नलिखित प्रयोग किया है:
Dir[Rails.root.join('app/controllers/*_controller.rb')].map { |path| path.match(/(\w+)_controller.rb/); $1 }.compact
Dir[Rails.root.join('app/controllers/*_controller.rb')].map { |path| (path.match(/(\w+)_controller.rb/); $1).camelize+"Controller" }
इस रूप में यह नियंत्रक फ़ाइल के भीतर प्रकट होता है हमें नियंत्रक का सही नाम देता है।
एक अन्य समाधान और विकास में (यदि आप रेल 5 में हैं) और नियंत्रक और कार्यों मैप करने की आवश्यकता: अगर जरूरत:
Rails.application.routes.set.anchored_routes.map(&:defaults)
आप अस्वीकार कर सकते हैं [आंतरिक]:
.reject { |route| route[:internal] }
हैं आप नियंत्रकों और कार्यों को सूचीबद्ध करने जा रहे हैं, क्यों न केवल रेक मार्गों का उपयोग करें? सुनिश्चित करें कि आउटपुट गन्दा है, लेकिन यह आपकी टर्मिनल विंडो का विस्तार करके तय किया गया है। – EmFi
मैं बस त्वरित कोड डाल रहा था जो लिंक के समान होगा। थोड़ा सा अभ्यास करना मुझे याद है। – Jim