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.
param
opcji dla szyn 3: gist.github.com/sj26/44ef47fe8b98b46ee32dpost_slug
, co może być mylące.w Railsach 4, podaj opcję param, aby zmienić parametry: id. Na przykład
resources :photos, param: :photo_name
wygeneruje / photos /: photo_nameźródło
Jeśli dobrze cię rozumiem, to co chcesz to mieć
client_name
zamiastid
w swoim adresie URL, prawda?Możesz to zrobić, nadpisując
to_param
metodę w swoim modelu. Więcej informacji znajdziesz tutaj .źródło
Jest za to klejnot, tak jak klejnot do wszystkiego;)
Używam FriendlyId do tego rodzaju zachowania w szynach 3.
Będzie to jednak wymagało dodania kodu do modelu, na przykład:
... a jeśli twoi klienci nie mają nazw zgodnych z URI, możesz użyć do tego slug, co możesz zrobić za pomocą
has_friendly_id :name, :use_slug => true
. Jeśli używasz ślimaków, oczywiście musisz je również utrwalić w bazie danych.I jak już wspomniano, nadal możesz użyć
to_param
sztuczki z szynami 3, jak opisano tutaj . Uważam jednak, że FriendlyId jest nieco bardziej wszechstronny.źródło
to_param
, ale robi też inne sprytne rzeczy w tle. Link znalazłem tutaj: stackoverflow.com/questions/4744446/…to_param
psuje moją część aplikacji. Właściwie desperacko szukam podejścia do routingu, aby zmienić moje API, ale bez zrywania części Model i Frontend z aplikacji. Dlaczego nie mogę po prostu zmodyfikować tras tylko tak, jak powiedziałem i przykładowy post dla starszych wersji szyn powyżej?@client = Client.find(:name => param[:client_name]
wClientsController#show
? To może zadziałać.Client.where(:name => param[:client_name]).first
, to jest.W Railsach 3 możesz zmienić nazwy kluczy id używając kombinacji przestrzeni nazw i zakresów w ten sposób (choć niezbyt ładne):
źródło