zostanie wyswietlone “foo” zamiast “admin/foo”. Jak grzecznie poprosić railsy, aby zwróciły nam pełną nazwę kontrollera? Potrzebne jest mi to do zmiany języka na stronie. Mam ikonki [pl] [en] [de] i chce, aby po kliknięciu na ikonkę z językiem strona przeładowała się i była w nowym języku.
Teraz będzie Ci łapać wszystkie wpisy w stylu “/pl/books”, “/pl/books/list”, “/en/clients/show/1”, a nawet zagnieżdżone kontrolery “/pl/admin/clients/show/20”. Tutaj masz na sztywno 3 języki wpisane w routes, ale może usunąć to ograniczenie i obsłużyć sobie dany język w kontrolerze lub filtrze (params[:lang]).
map.connect ‘admin’, :controller => “admin/index”, :action => “index”, :lang => “pl”
map.connect ‘:lang/admin/’, :controller => “admin/index”, :action => “index”
map.connect ‘:lang/admin/:controller’
map.connect ‘:lang/admin/:controller/:action’
map.connect ‘:lang/admin/:controller/:action/:id’[/code]
Gdy jesteśmy w “admin/article” wybieramy zmianę wersji językowej (powiedzmy PL zamieniamy na EN) klikając w ikonkę z linkiem. I teraz jak zrobić, aby strona się przeładowała (ten sam kontroler, ta sama akcja - zmienia się tylko język).
/pl/admin/article => user klika [EN] => /en/admin/article/
Ponieważ w definicji trasowania (przez co rozumiem routes.rb) nie można odwołać się do aktualnych wartości parametrów (a może się da?), to konieczne jest zastosowanie dodatkowego parametru, który będzie ustawiany, kiedy wywoływany jest kontroler zagnieżdżony (tzn. admin/costam). Rozwiązanie nie jest bardzo eleganckie, ale powinno działać.
url_for wygeneruje aktualny zestaw params a ty musisz tylko nadpisać ten na którym ci zależy ( w tym wypadku :lang)
Jeśli :lang znajduje się w routes.rb (np. /:lang/:controller/:action) to url_for go podmieni na /en/:controller/:action
Jeśli :lang nie ma akurat w routes.rb dla danej akcji to zostanie dopisany (np. /articles/show/1?lang=en
Mam nadzieję, że to pomoże, powodzenia w odkrywaniu Railsów
Kod jest ok, na jego podstawie nic nie wynika. Na moje oko powinieneś szukać błędu w routes.rb. Patrząc na Twoje routes we wcześniejszym poście wydaje mi się, że definiujesz je w złej kolejności. Te bardziej szczegółowe powinny być na samym początku. Dodatkowo radzę Ci wyłączyć defaultowe wpisy, czyli tego typu “map.connect ‘:controller/:action/:id’”. Ja mam wpisy typu:
I wszystko działa dobrze. W ten sposób muszę mieć po jednym wpisie dla każdego kontrolera, ale nie jest to problemem póki aplikacja nie ma kontrolerów w setkach ;).