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
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
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.
Możesz wymagać, aby wszystkie pliki w "# {RAILS_ROOT}/aplikacji/kontrolerach" zapełniły listę w trybie programowania. – EmFi
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
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. –
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
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
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.
nie działały dla aktywnego administratora, ale Twoje prace! Dziękuję Ci – Fedcomp
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
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.
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] }
- 1. Uzyskaj wszystkie kontrolery Angulara
- 2. Jak znaleźć wszystkie kontrolery i akcje
- 3. Widok otwierający Kontrolery programowo w wersji szybkiej
- 4. Jak wyświetlić wszystkie ciągi tekstowe do zapytania w Railsach?
- 5. Kontrolery Boga - jak im zapobiegać?
- 6. Programowo wykrywaj i przechwytuj nieskończone pętle przekierowania w Railsach
- 7. jak dodać dwa kontrolery widoku w UIPageViewcontroller
- 8. Jak zaimplementować HATEOAS w Railsach
- 9. Elegancka wersja API w Railsach
- 10. Dlaczego nie można wymieniać tablic wielowymiarowych?
- 11. Jak tworzyć kategorie w Railsach
- 12. Jak komentować ERB w Railsach?
- 13. Jak używać parametryzacji w Railsach?
- 14. Jak wymieniać dane między renderscript i platformą Android?
- 15. Jak wymieniać dane (obiekty) między różnymi działaniami Android?
- 16. Jak zezwolić użytkownikom na definiowanie dowolnej liczby pól w Railsach
- 17. Jak mogę zrobić coś takiego jak find_in_batches_by_sql w Railsach
- 18. Jak zorganizować kontrolery/prezenterów w dużej aplikacji JavaFx 2.0?
- 19. asp.net mvc Jak poprawnie przetestować kontrolery
- 20. Jak ustawić programowo programowo?
- 21. Jak programowo pobrać wszystkie i uruchomione rozmiary aplikacji, użycie procesora?
- 22. Jak otworzyć programowo programowo
- 23. Swift: Jak programowo kliknąć przycisk?
- 24. Kontrolery testowe w klejnocie z RSpec
- 25. Jak trasować kontrolery bez działań CRUD?
- 26. Wiele zagnieżdżonych zawiera w Railsach
- 27. Kontrolery a poziom aplikacji Widok w Backbone.js
- 28. Liczba słów w Railsach?
- 29. Wiele warunków w Railsach
- 30. Monitorowanie użytkownika w Railsach
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
Po prostu odkładałem szybki kod, który byłby podobny do tego, co robi link. Ćwiczy trochę, więc pamiętam. – Jim