Routing i Rails
On januar 18, 2022 by adminHvad er routing helt præcist?
Når brugeren sender en HTTP-anmodning til programmet, skal den ledes til den rigtige controller. Du kan forestille dig en router som en receptionist på, der stiller dig om til den rette person at tale med.
Hvordan foregår routing i Ruby on Rails?
I Rails bor ruterne i din applikation i config/routes.rb
. Rails-routeren genkender URL’er og sender dem til en controllers handling. Den kan også generere stier og URL’er, så du undgår at skulle hardcode strings i dine visninger. Lad os overveje en applikation til at reservere værelser på forskellige hoteller og se på, hvordan dette fungerer.
Typer af HTTP-anmodningsmetoder
Programmet modtager en HTTP-anmodning, som medbringer en metode, som kan være:
GET – Henter en ressource
POST – Opretter en ressource
PUT – Opdaterer en ressource fuldstændigt
PATCH – Opdaterer en ressource delvist
DELETE – Sletter en ressource
Disse metoder bestemmer, hvilken controlleraktionsmetode der kaldes.
Afkodning af http-anmodningen
Hvis programmet modtager anmodningen, GET /hotels/1
. Anmodningen sendes til hotels controllerens show
handling show
med { id: '1' }
i params.
get '/hotels/:id', to: 'hotels#show'
Sådan er det også
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'
TIP: Hvis du nogensinde ønsker at få vist alle ruterne i din applikation, kan du bruge rails routes
på din terminal, og hvis du ønsker at få vist ruterne for en bestemt ressource, kan du bruge rails routes | grep hotel
. Dette vil liste alle ruterne for Hotel.
Definition af ressourcer
Som receptionisten har en registrering af alle reservationer, har programmet også sin egen registrering i config/routes.rb
.
Rails.application.routes.draw do resources :hotelsend
Ved at skrive resources :hotels
opretter vi alle syv forskellige ruter i dit program, som alle mapper til Hotels controller som nævnt ovenfor.
Hvis din controller kun har nogle få af disse handlinger, kan du ændre det samme med følgende nøgleord.
Nøgleordet omfatter kun kun de nævnte handlinger.resources :hotels, only:
Der er også nøgleordet undtagen til at nævne dem, du ikke ønsker at inkludere.
resources :hotels, except:
Enkelt og flere ressourcer
I nogle tilfælde har vi en enkelt ressource dvs. vi skal kun have adgang til en enkelt side i stedet for at henvise til et id. Det er i så fald, at vi bruger entalbetegnelsen, ressource.
resource :hotels
Når man skal definere flere ressourcer,
resources :hotels, :rooms
hvilket fungerer på samme måde som
resources :hotels,resources :rooms
Nested Resources
Sommetider har vi nested routes, /hotels/:id/rooms
som er et resultat af ressourcer, der logisk set er børn af andre ressourcer. Antag for eksempel, at din applikation indeholder disse modeller:
class Hotel < ApplicationRecord has_many :roomsendclass Room < ApplicationRecord belongs_to :hotelend
I så fald vil vi deklarere vores ressourcer på denne måde,
resources :hotels do resources :roomsend
Denne deklaration hjælper os med at få adgang til de indlejrede URL’er såsom /hotels/:id/rooms
, /hotels/:id/rooms/:id
, /hotels/:id/rooms/new
osv
Yderligere studier
Hvis du vil grave dybere ned i routing, kan du læse Rails Routing udefra i http://guides.rubyonrails.org/routing.html.
Oversidefoto af Javier Allegue Barros på Unsplash (https://unsplash.com/photos/C7B-ExXpOIE)
Skriv et svar