Cześć!
w tym odcinku chciałbym pokazać wam jak dodać tak zwany “slug” do naszego adresu url. W tej chwili jeżeli popatrzymy na nasz adres url zawiera on id z bazy. Nie jest to rozwiązanie przyjazne użytkownikom oraz wyszukiwarkom. Slug dodany do naszego modelu nada każdemu elementowi łatwy do odczytania identyfikator.
# tradycyjny url
http://example.com/states/4323454
# po dodaniu suga
http://example.com/states/washington
By dodać slug do modelu najprościej było by dodać nową kolumnę w bazie danych i samemu generować slug na podstawie innego pola. Np tytułu naszego posta. Jednak jest wiele problemów które trzeba by wtedy ogarnąć. Slug jest skróconą wersja innego pola, jak mamy post testujemy rozwiązanie a
oraz testujemy rozwiązanie b
to skrócona wersja testujemy
mogła by nam generować wiele problemów. Dlatego w celu obsługi takich adresów użyje gema friendly_id. Jest to bardzo popularny gem, regularnie aktualizowany i istnieje od 8 lat.
do Gemifile dodajemy
gem 'friendly_id', '~> 5.4.0'
odpalamy bundle install
gem jest zainstalowany
musimy jeszcze dodać nową migracje
rails g migration AddSlugToPosts slug:uniq
oraz rails generate friendly_id
na koniec odpalamy migracje
rails db:migrate
zajrzyjmy do naszego modelu post.rb
musimy dodać informacje związane z friendly id
class Post < ApplicationRecord
extend FriendlyId
friendly_id :title, use: :slugged
end
najważniejsze to poinformować z jakiego pola ma tworzyć slug
friendly_id :title, use: :slugged
zajrzyjmy też do kontrolera posts_controller.rb
musimy zmienić metodę set_post
, by szukała postów przy pomocy sluga
def set_post
@post = Post.friendly.find(params[:id])
end
utwórzmy nowy Post
i zobaczmy czy zadziała
Jeżeli nasza aplikacja zawiera już jakieś dane powinniśmy ponownie zapisać każdy rekord, by wygenerować slug
Post.find_each(&:save)
To by było na tyle
Nowy odcinek już wkrótce.
Miłego kodowania