Routes i namespace

Witam. Wiem, że są toturiale oraz oficjalna dokumentacja na temat routes i namespace, jednak nie mogę zrozumieć ich działania. Czy ktoś może dobitnie mi to wytłumaczyć? :frowning:
I podać przykład?
Jestem początkująca, nauka mi idzie ale na tym ewidentnie stanęłam i nie rozumiem. Proszę o wyrozumiałość :frowning:

Masz na przykład artykuły, czyli pliki:

app/controllers/articles_controler.rb
app/models/article.rb
app/views/articles/index.html.erb
app/views/articles/show.html.erb

W pliku routes.rb masz coś w rodzaju

 resources :articles

Rails będzie przekierowywać adresy /articles, /articles/new, /articles/123 itd. do odpowiednich akcji w kontrolerach automatycznie, bo to załatwia metoda resources.

Ale na przykład chcesz, żeby admini i zwykli userzy mieli inaczej wyświetlane artykuły. Żeby nie wymyślać nowych nazw i żeby uniknąć kombinowania w controllerach i widokach, używasz namespace, czyli jakby prefiksu, który sprawia, że możesz po prefiksie użyć nazwy, która już występuje i jest przypisana do innej rzeczy.

Teraz jak dodasz

namespace :admin do
  resources :articles
end

wtedy będą przekierowywane adresy /admin/articles, admin/articles/new itd. po prostu z “admin/” przed całą resztą. I będą one przekierowywane nie do ArticlesController, jak poprzednie, ale do kontrolera Admin::ArticlesController. A to jest całkowicie inny kontroler, chociaż ma podobną nazwę.

Ten kontroler wg konwencji powinien być w

app/controllers/admin/articles_controller.rb

i będzie klasy Admin::ArticlesController, pierwsza linia kodu to będzie
class Admin::ArticlesController < ApplicationController

Pozmieniają się też helpery “path” czyli zamiast edit_article_path(article) będzie edit_admin_article_path(article) i tak dalej.

Pliki widoków również będą domyślnie szukane w podkatalogu “admin”, czyli

app/views/admin/articles/index.html.erb
app/views/admin/articles/show.html.erb

Dzięki temu masz teraz dwie osobne wersje stron dla artykułów. W zależności czy adres będzie /admin/articles czy /articles.

4 Likes

Dziękuję!
Pewnie i niejednej zbłąkanej duszyczce to tłumaczenie rozwiąże wątpliwości :slight_smile: