Szyny 4 i 5
W Rails 4 :param
dodano 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.rb
pliku:
# 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 :key
opcję 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_param
metoda. Nadal można zdefiniować parametry niestandardowe w trasach zdefiniowana scope
i 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ą resources
automatycznie tworzone dla Ciebie, ale pozwoliłoby to osiągnąć to, czego szukasz. Możesz także efektywnie skorzystać z :controller
opcji scope
i dodatkowych scope
blokó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.