Jeden kontroler dla "admina" i usera

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 :wink:

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ę? :slight_smile: Ta wydaje się całkiem logiczna, ale może ktoś wpadł na jakieś rozwiązania bardziej rails way :wink:

Witam.

Jasne, że jest rozwiązanie bardziej rails way :slight_smile:
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

akcje wywołujesz poprzez: http://localhost/admin/articles/list

Analogicznie dla części contentowej:

/app/controllers/content/articles_controller.rb

class Content::ArticleController < ApplicationController
def list

end
end

oraz plik widoku: /app/views/content/article/list.rhtml

wszystko to można stworzyć z automatu w kosoli:

ruby script/generate controller Admin::Article action1 action2 …

[quote=kkempin]Witam.

Jasne, że jest rozwiązanie bardziej rails way :)[/quote]
Drogusowi chodziło o tą dyskusje

http://forum.rubyonrails.pl/viewtopic.php?id=455

i rozumiem, że tego sposobu chciałby uniknąć

pozdrawiam

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

class Articles < ApplicationController
[…]
end

routes.rb:

map.articles ‘/articles/:action/:id’, :controller => ‘articles’
map.admin_articles ‘/admin/articles/:action/:id’, :controller => ‘admin/articles’

A potem juz tylko dla konsekwentosci

<%= link_to(‘Edit Articles’, admin_article_url(:action => ‘edit’, :id => @article.id)) %>[/code]

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 :slight_smile: 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 :wink: ale jak kto woli :slight_smile: