Jakiś czas temu była dyskusja o niestosowaniu kontrolerów w podkatalogach (z reguły chodzi o stworzenie katalogu admin). Idea mi się podoba pomimo tego co pisałem o “nested controllers”. Ostatnio musiałem zrobić dużo dziwnych wpisów w routes.rb i oczywiście wszystko sie dało zrobić, ale jednak te kilkanaście (a w skrajnych wypadkach kilkadziesiąt) minut na obczajenie metod obejścia trochę dało się we znaki.
Zaczynam aktualnie pisać aplikację i niestety nijak nie będzie się tam dało zrobić jednego widoku dla administratora i użytkownika. Przy małych aplikacjach nie ma problemu, ale najczęściej po prostu trzeba wydzielić “część administracyjną”.
W tych prostszych aplikacjach wymyśliłem prostego myka. Jeden kontroler, w routes.rb 2 wpisy dla każdego kontrolera - jeden z prefixem admin_. I w zależności od tego czy wywołane jest /admin/controller czy /controller dzieją się różne dziwne rzeczy
Tylko, że aplikacji z jakimś większym wydzielonym panelem administracyjnym może zrobić się dość duży bałagan. Przydadzą się dwa kontrolery - jeden na akcje dla zwykłych userów i jeden z akcjami do panelu. Jedyne rozwiązanie jakie tutaj widzę to kontrolery typu: articles i admin_articles. Zna ktoś może jakąś fajniejszą metodę? Ta wydaje się całkiem logiczna, ale może ktoś wpadł na jakieś rozwiązania bardziej rails way
Jasne, że jest rozwiązanie bardziej rails way
Np. masz kontroler do wyświetlania artykułów. Potrzebujesz części administracyjnej i contentowej. Tworzysz zatem plik /app/controllers/admin/article_controller.rb , o takiej treści:
class Admin::ArticleController < ApplicationController
def list
…
end
end
oraz plik widoku: /app/views/admin/article/list.rhtml
Uzywalem zagniezdzonych kontrolerow juz w 4 aplikacjach i jak do tej pory nie mialem problemow, chyba ze w routes.rb uzywalem tylko /:controller/:acion/:id. Owszem, jesli zacznie sie uzywac map. a potem _url to routes.rb zaczyna troche rosnac przy wiekszych aplikacjach ale i tak to nic w prowaniu z tym co musial bym czarowac w frameworkach javowych.
Trzymanie odrebnej czesci aplikacji w podkatalogu /controllers/admin/ /views/admin/ robi mniejszy balagan. Wystarczy Articles i Admin::Articles. Ja do tego jeszcze uzywam Admin::BaseController < ApplicationController ktory zawiera filtry i warstwe ktora jest potrzebna tylko w panelu administracyjnym.
Tak wiec umnie wyglada to tak:
[code]class Admin::Articles < Admin::BaseController
[…]
end
class Admin::BaseController < ApplicationController
private
[…]
end
Nie wiem, czy to w jakiś sposób pomoże, ale ja używam po prostu dwóch instancji aplikacji Rails. Po podlinkowaniu modelu (ln -s) nie stanowi to problemu, a admin jest dostępny po prostu pod admin.aplikacja.pl przez https.
Minusem jest brak wspólnych kodów helperów, ale i application helper można podlinkować, można też porobić myki z SVNem.
Polecam tą metodę, ponieważ moim zdaniem jest bardzo wygodna - mam aplikację działającą w ten sposób produkcyjnie i osobiście nie dopatrzyłem się żadnych ograniczeń.
kkempin:
Tak jak punkracy zauważył tego właśnie chciałem uniknąć.
PaK:
też używałem tego rozwiążania w paru aplikacjach ale jednak to, o którym piszę wydaje mi się “ładniejsze” w jakiś sposób. o ile będę miał czas na przemyślenie jak to fajnie rozplanować - chwilowo nie mam do tego motywacji, bo siedzę nad czymś zupełnie innym.
bumelant:
moim zdaniem biedne to rozwiązanie ale jak kto woli