Routing w Railsach
On 18 stycznia, 2022 by adminCzym dokładnie jest routing?
Kiedy użytkownik zgłasza żądanie HTTP do aplikacji, powinno ono zostać skierowane do właściwego kontrolera. Możesz wyobrazić sobie router jako recepcjonistę, który łączy cię z właściwą osobą, z którą chcesz porozmawiać.
Jak odbywa się routing w Ruby on Rails?
W Railsach, trasy twojej aplikacji żyją w config/routes.rb
. Router Railsów rozpoznaje adresy URL i wysyła je do akcji kontrolera. Może on również generować ścieżki i adresy URL, unikając potrzeby twardego kodowania ciągów znaków w twoich widokach. Rozważmy aplikację do rezerwacji pokoi w różnych hotelach i przyjrzyjmy się jak to działa.
Typy metod żądania HTTP
Aplikacja otrzymuje żądanie HTTP, które niesie ze sobą metodę, która może być:
GET – pobiera zasób
POST – tworzy zasób
PUT – całkowicie aktualizuje zasób
PATCH – częściowo aktualizuje zasób
DELETE – usuwa zasób
Metody te określają, która metoda akcji kontrolera jest wywoływana.
Dekodowanie żądania http
Jeśli aplikacja odbiera żądanie, GET /hotels/1
. Żądanie jest wysyłane do akcji show
kontrolera hoteli z { id: '1' }
w parametrach.
get '/hotels/:id', to: 'hotels#show'
Podobnie,
get '/hotels', to: 'hotels#index'get '/hotels/:id', to: 'hotels#show'get '/hotels/new', to: 'hotels#new'post '/hotels', to: 'hotels#create'get '/hotels/:id/edit', to: 'hotels#edit'put '/hotels/:id', to: 'hotels#update'delete '/hotels/:id', to: 'hotels#destroy'
WSKAZÓWKA: Jeśli kiedykolwiek będziesz chciał wylistować wszystkie trasy swojej aplikacji, możesz użyć rails routes
na swoim terminalu, a jeśli chcesz wylistować trasy konkretnego zasobu, możesz użyć rails routes | grep hotel
. To wyświetli wszystkie trasy Hotelu.
Definiowanie zasobów
Podobnie jak recepcjonista trzyma rekord wszystkich rezerwacji, aplikacja również ma swój własny rekord w config/routes.rb
.
Rails.application.routes.draw do resources :hotelsend
Pisząc resources :hotels
tworzymy wszystkie siedem różnych tras w aplikacji, wszystkie mapujące do kontrolera Hotels, jak wspomniano powyżej.
Jeśli twój kontroler ma tylko kilka z tych działań, możesz zmienić to samo za pomocą następujących słów kluczowych.
Słowo kluczowe obejmuje tylko wspomniane działania.resources :hotels, only:
Jest też słowo kluczowe except do nazwania tych, których nie chcesz uwzględniać.
resources :hotels, except:
Pojedyncze i wielokrotne zasoby
Czasami mamy pojedynczy zasób tj. musimy tylko uzyskać dostęp do pojedynczej strony zamiast odwoływać się do id. To wtedy używamy pojedynczego terminu, zasób.
resource :hotels
Gdy trzeba zdefiniować wiele zasobów,
resources :hotels, :rooms
który działa tak samo jak
resources :hotels,resources :rooms
Zagnieżdżone zasoby
Czasami mamy zagnieżdżone trasy, /hotels/:id/rooms
które są wynikiem zasobów, które są logicznie dziećmi innych zasobów. Na przykład, załóżmy, że twoja aplikacja zawiera te modele:
class Hotel < ApplicationRecord has_many :roomsendclass Room < ApplicationRecord belongs_to :hotelend
W takim przypadku zadeklarujemy nasze zasoby w ten sposób,
resources :hotels do resources :roomsend
Ta deklaracja pomaga nam uzyskać dostęp do zagnieżdżonych adresów URL, takich jak /hotels/:id/rooms
, /hotels/:id/rooms/:id
, /hotels/:id/rooms/new
itd
Dalsze badania
Jeśli chcesz zagłębić się w routing, możesz odnieść się do Rails Routing z zewnątrz w http://guides.rubyonrails.org/routing.html.
Cover Photo by Javier Allegue Barros on Unsplash (https://unsplash.com/photos/C7B-ExXpOIE)
.
Dodaj komentarz