2009-10-14 11 views
22

Próbuję zbudować aplikację RESTful, aby faktycznie zarządzać wieloma rodzajami konfigurowalnych obiektów, więc istnieje duża liczba typów "zasobów", a zatem wiele kontrolerów. Nadal jestem w fazie POC, więc byłoby miło, gdybym mógł pokazać wszystkie kontrolery na pierwszej stronie nawigacyjnej, więc czy jest to łatwy sposób (programowalny)?Jak programowo wymieniać wszystkie kontrolery w Railsach

Odpowiedz

5

Google:

Pierwszy wynik 'szyn liście kontrolerów.

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


Po zapoznaniu się z podklasy, myślę, że kod z mojego linku można zrobić po prostu ..

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

Jeśli masz zamiar wymienić kontrolerów i akcje, dlaczego nie skorzystać z tras rake? Z pewnością wynik jest niechlujny, ale można to naprawić, rozwijając okno terminala. – EmFi

+0

Po prostu odkładałem szybki kod, który byłby podobny do tego, co robi link. Ćwiczy trochę, więc pamiętam. – Jim

22
ApplicationController.subclasses 

To będzie Ci zacząć, ale pamiętajcie, że w trybie programistycznym niewiele będzie widać, ponieważ wyświetli tylko to, co zostało załadowane. Uruchom go w trybie produkcji i powinieneś zobaczyć listę wszystkich kontrolerów.

+4

Możesz wymagać, aby wszystkie pliki w "# {RAILS_ROOT}/aplikacji/kontrolerach" zapełniły listę w trybie programowania. – EmFi

+0

Należy zauważyć, że działa to w trybie produkcyjnym, ale nie w trybie programowania, ponieważ sterowniki są ładowane leniwie. Uruchom aplikację w trybie konsoli szyny i spójrz na podklasy/potomków, a nie zobaczysz żadnych. Wpisz nazwę jednego z kontrolerów, a nazwana klasa pojawi się jako podklasa. ActiveAdmin wydaje się robić dobrą robotę w tym ... możesz chcieć sprawdzić swój kod na GitHub. – Raels

+0

To nie jest kompletne rozwiązanie, ponieważ nie ma wszystkich kontrolerów, tylko bezpośrednie podklasy AplicationController. Jeśli masz dwa poziomy zagnieżdżania w swojej hierarchii, nie możesz ich wszystkich zagnieździć. Zamiast tego użyj ApplicationController.descendants. Aby uzyskać wszystkie kontrolery w czasie ładowania, możesz użyć Rails.application.eager_load! w inicjatorach środowiska programistycznego lub testowego, ale pamiętaj, że załaduje on wszystkie aplikacje szyn i może spowolnić rozruch i wywołać jakiekolwiek efekty uboczne. –

38

W Rails 3.1 i nowsze:

Rails.application.routes 

To daje wszystkie kontrolery, działania i ich tras, jeśli mają swoje ścieżki w pliku routes.rb.

Na przykład:

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

Aktualizacja: Dla Rails 3.2, ścieżka silnik Journal zmieniło, więc staje się kod:

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 

Aktualizacja: Nadal pracuje dla Rails 4.2.7. Aby wyodrębnić listę kontrolerów (za rzeczywiste pytanie), można łatwo wyodrębnić kontroler i uniq

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

Oto moje źródła: https://github.com/rails/rails/blob/master/railties/lib/rails/tasks/routes.rake https://github.com/rails/rails/blob/ master/railties/lib/rails/application/route_inspector.rb Uświadomiłem sobie również, że tory tworzą wbudowaną trasę dla informacji o serwerze w trybie programowania, ale znalezienie trasy pozostawia ćwiczenie dla czytelnika. Podklasy – nurettin

9

Gdy @ metoda JDL będzie pracować w wielu sytuacjach nie powiedzie, jeśli masz podklasy kontrolera (np ContactPageController dziedziczy PageController, która dziedziczy po ApplicationController).

Dlatego lepszym sposobem jest użycie:

::ApplicationController.descendants 

Korzystanie routes może nie działać, jeśli masz złożoną aplikację, w której części są oderwane jak silniki, które zostaną ukryte.

+0

nie działały dla aktywnego administratora, ale Twoje prace! Dziękuję Ci – Fedcomp

6

Szczególnie podobał mi @jdl rozwiązanie

ApplicationController.subclasses 

Ale w moim przypadku, gdzie naprawdę potrzebne wszystkie nazwy kontrolera w formacie podkreślenia (nie mam subdirs np /admin) użyłem następujące:

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" } 

to daje nam dokładną nazwę kontrolera, gdyż pojawia się w pliku sterownika.

2

Innym rozwiązaniem (jeśli jesteś w Rails 5) oraz w rozwoju i potrzebują do mapowania kontrolerów i działań:

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

Można odrzucać [: wewnętrzny] W razie potrzeby:

.reject { |route| route[:internal] } 
Powiązane problemy