Szyny 4 i 5
W Rails 4 :paramdodano opcję, która wydaje się robić dokładnie to, czego szukasz. Możesz spojrzeć na kod Rails 3 w porównaniu z kodem Rails 4 .
Detale
Możesz to łatwo zaimplementować w swoim routes.rbpliku:
# config/routes.rb
resources :posts, param: :slug
# app/controllers/posts_controller.rb
# ...
@post = Post.find_by(slug: params[:slug])
# ...
Od wydania Rails 4 ta funkcjonalność jest udokumentowana w Rails Guides .
Szyny 3
Niestety w Railsach 3 usunięto :keyopcję dla resources, więc nie można już łatwo zmienić nazwy tras utworzonych w ten sposób, po prostu podając dodatkową opcję.
Detale
Zakładam, że w minionym roku aplikacja działała tak, jak chcesz, ale spróbuję uzyskać efekt, który opisujesz w Railsach 3 routes.rb. Będzie to wymagało trochę więcej pracy niż to_parammetoda. Nadal można zdefiniować parametry niestandardowe w trasach zdefiniowana scopei match(lub jego kuzyni get, put, post, i delete). Po prostu wpisz nazwę parametru, który chcesz dopasować:
get 'clients/:client_name', :to => 'clients#show', :as => client
scope 'clients/:client_name' do
get 'sites/:name', :to => 'sites#show', :as => site
end
Musiałbyś ręcznie dodać wszystkie trasy, które są resourcesautomatycznie tworzone dla Ciebie, ale pozwoliłoby to osiągnąć to, czego szukasz. Możesz także efektywnie skorzystać z :controlleropcji scopei dodatkowych scopebloków, aby usunąć część powtórzeń.
EDYCJA (8 maja 2014): Uczyń to bardziej oczywistym, że odpowiedź zawiera informacje dla obu Rails 3 i 4. Zaktualizuj linki do kodu, aby przejść do dokładnych numerów linii i zatwierdzeń, aby działały przez dłuższy czas.
EDYCJA (16 listopada 2014): Rails 4 powinny być teraz na szczycie i zawierać istotne informacje, ponieważ jest to aktualna wersja Railsów już od dłuższego czasu.
EDYCJA (9 sierpnia 2016 r.): Zastanów się, że rozwiązanie nadal działa w Railsach 5 i zaktualizuj nieaktualne łącza.