Rails

2009-10-14 11 views
22

'daki tüm denetleyicileri program aracılığıyla listeleme Birçok yapılandırılabilir nesneyi gerçekten yönetmek için RESTful bir uygulama oluşturmaya çalışıyorum, bu nedenle çok fazla "kaynak" türü ve dolayısıyla çok sayıda denetleyici var. Hala POC evresindeyim, bu yüzden ilk gezinti sayfasındaki tüm denetleyicileri gösterebilirsem hoş olur, böylece bunu yapmak için herhangi bir kolay yol (programlanabilir)?Rails

cevap

5

Google: 'raylar liste kontrolörleri

İlk sonuç.

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


alt sınıfları öğrendikten sonra, ben

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

ise Denetleyicileri ve eylemleri listeleyeceksiniz, neden sadece komisyon rotalarını kullanmıyorsunuz? Çıkışın dağınık olduğundan emin olun, ancak bu, terminal pencerenizi genişleterek sabitlenmiştir. – EmFi

+0

Sadece bağlantının yaptıklarına benzeyen hızlı bir kod koyuyordum. Biraz pratik yaparak hatırlıyorum. – Jim

22
ApplicationController.subclasses 

Bu başlangıç ​​alırsınız .. benim bağlantıdan kod olarak basitçe yapılabilir düşünüyorum, ama Geliştirme modunda çok fazla görmeyeceğinizi unutmayın, çünkü size yalnızca neyin yüklü olduğunu gösterecektir. Üretim modunda ateşleyin ve tüm denetleyicilerinizin bir listesini görmelisiniz. 3.1+ Rails

+4

Listenizi geliştirme modunda doldurmak için "# {RAILS_ROOT}/uygulama/denetleyiciler" içindeki tüm dosyaların girilmesini isteyebilirsiniz. – EmFi

+0

Bu, üretim modunda çalışır, ancak geliştirme modunda değil, çünkü kontrolörler tembel olarak yüklendiğine dikkat etmek önemlidir. Uygulamanızı raylar konsol modunda tetikleyin ve alt sınıflara/torunlara bakın ve hiç görmeyeceksiniz. Denetleyicilerin birinin adını yazın ve sonra adlandırılmış sınıf bir alt sınıf olarak görünecektir. ActiveAdmin bu konuda iyi bir iş gibi görünüyor ... GitHub'da kodlarını kontrol etmek isteyebilirsiniz. – Raels

+0

Bu tam bir çözüm değildir çünkü tüm denetleyicileri almaz, yalnızca AplicationController'ın alt sınıflarını almaz. Hiyerarşinizde iki düzey yuvalama varsa, bunların hepsini kaydetmeyeceksiniz. Bunun yerine ApplicationController.descendants kullanın. Ve tüm denetleyicileri yükleme zamanında almak için Rails.application.eager_load'u kullanabilirsiniz! geliştirme veya test ortamı başlatıcıları ama tüm raylar yükünü yükleyecektir bir önyükleme yavaşlatabilir ve herhangi bir yan etkisi var farkında olun. –

38

: Eğer routes.rb dosyasında yollarını varsa

Rails.application.routes 

Bu size tüm denetleyicileri, eylem ve onların rotalarını verecektir. Örneğin

:

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

Güncelleme: Kod olur böylece Raylar 3.2 için , Journal of motor yolu değişti:

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 

Güncelleme: Hala Raylar 4.2.7 için çalışan. (Gerçek soru başına) denetleyicilerin listesini çıkarmak için tek yapmanız gereken denetleyicisi ayıklamak ve edebilirsiniz uniq

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

İşte kaynaklarım: https://github.com/rails/rails/blob/master/railties/lib/rails/tasks/routes.rake https://github.com/rails/rails/blob/ master/railtiler/lib/raylar/application/route_inspector.rb Ayrıca rayların geliştirme modu sunucu bilgisi için dahili bir yol oluşturduğunu da fark ettim, ancak bu rotayı bulmak okuyucu için bir egzersiz yaptı. – nurettin

9

JDL yöntemi durumlarda bir dizi çalışacaktır @ denetleyici alt sınıflarını (örn ContactPageController devralır varsa başarısız olsa da ApplicationController'dan gelen PageController).

Eğer parçalar motorlar olarak soyutlanmış bir kompleks uygulaması varsa routes çalışmayabilir kullanma
::ApplicationController.descendants 

bu gizlenecek:

nedenle daha iyi bir yöntem kullanmaktır. Özellikle

ApplicationController.subclasses 

Ama gerçekten çizgi biçiminde tüm denetleyici adları gerekli benim durumumda, çözümü

@jdl sevdim

+0

alt sınıflar aktif yönetici için çalışmadı, ancak çalışmalarınız! teşekkür ederim – Fedcomp

6

(I altklasörlere örn yok: /admin) Aşağıdaki kullandı:

o denetleyici dosya içinde göründüğü gibi
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" } 

Bu bize kontrolörün tam adını verir.Kalkınma ve içinde (Rails 5 iseniz) ve denetleyicileri ve eylemler haritaya ihtiyaç

2

Başka bir çözüm:

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

Sen reddedebilirsiniz [: Dahili] Gerekirse:

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